javascript闭包:隐式参数,调用方
我需要一些关于javascript调用元数据的说明。下面提供的代码具有SenderAsParameterFunc和NoExplicitParametersFunc,它们是从另一个函数的each循环调用的javascript闭包:隐式参数,调用方,javascript,dom,closures,prototypal-inheritance,Javascript,Dom,Closures,Prototypal Inheritance,我需要一些关于javascript调用元数据的说明。下面提供的代码具有SenderAsParameterFunc和NoExplicitParametersFunc,它们是从另一个函数的each循环调用的 var Obj = function(){ Obj.SenderAsParameterFunc = function(sender, param1, param2){ // log $(sender).id; } Obj.NoExplicitParametersFunc = function
var Obj = function(){
Obj.SenderAsParameterFunc = function(sender, param1, param2){
// log $(sender).id;
}
Obj.NoExplicitParametersFunc = function(){
// EXTRACT DEFAULT SENDER/CALLEE
// I see in console Obj.NoExplicitParametersFunc.caller.arguments >> SEE REF1
}
Obj.NoExplicitParametersFuncWithExtraArgs = function(this, par1, par2){
// 'this' from each loop?
}
Obj.AnotherFunc = function(){
var X = $('myselect');
var par1 = 1;
var par2 = 'bla';
$.each(X.find("option"), function () {
Obj.SenderAsParameterFunc(this, par1, par2);
// 'this' here references current object from 'each' loop
});
$.each(X.find("option"), Obj.NoExplicitParametersFunc);
// must be equvalent to first var,
// but to extract 'inner' this we have to do more magic in NoExplicitParametersFunc...
var par1 = 1;
var par2 = 'bla';
$.each(X.find("option"), Obj.NoExplicitParametersFuncWithExtraArgs);
}
}
那么,应该在NoExplicitParametersFunc中编写什么来访问每个选项,就像在SenderAsParameterFunc中使用$(this)那样
==========
好的,总结一下我所学到的:
如果函数没有参数
$.each(X.find("option"), Obj.NoExplicitParametersFunc);
$.each(X.find("option"), function () { Obj.SenderAsParameterFunc(this, par1, par2); });
然后默认情况下传递“this”,并可在函数中访问
如果函数有参数
$.each(X.find("option"), Obj.NoExplicitParametersFunc);
$.each(X.find("option"), function () { Obj.SenderAsParameterFunc(this, par1, par2); });
然后,必须将“this”作为参数(首先?)包含在函数中才能访问
=============
参考文献1:
currentTarget、delegateTarget、srcElement、target都是相同的,但实际使用的最正确的方法是什么?推荐人将不胜感激
谢谢
否。此处没有引用匿名函数(只能在$中作为参数访问。每个)。的回调中的确实引用了迭代的项。这也回答了你的问题:
Obj.NoExplicitParametersFunc = function(i, v){
console.log(this, i, v);
}
如果函数具有参数[并且在匿名函数表达式中调用],则必须将“this”作为参数包含(首先?)才能在函数中访问
是的,因为这个
对于每个函数调用都是唯一的,所以您必须传递它的值-就像您不能只访问调用者函数的局部变量一样,您不能访问它的这个
值。要使用此特定值调用函数,可以使用:
TL;DR:在您的情况下,这无关紧要,但如果您有疑问,请使用currentTarget
我不太明白你的第一个问题,但是关于第二个问题
发送事件时,通常会出现此事件气泡,例如,在此页面上:
<body>
<div>
<img src="foobar.png" />
</div>
</body>
因此,您可以向body
添加一个侦听器,从而捕获事件。但为了让您知道实际单击了哪个元素(本例中为img
),它提供了event.target
属性(srcelelement
,在Internet Explorer上)
delegateTarget
是jQuery添加的属性,如果使用事件委派,它会提供额外的信息。我不知道到底是什么,但你可以看看
最后,currentTarget
是您附加到事件的元素,如果我们将侦听器添加到body
中,它将是body
。因此,每个事件的参数都是
fire body.click with { target: img, currentTarget: body }
fire div.click with { target: img, currentTarget: div }
fire img.click with { target: img, currentTarget: img }
fire div.click with { target: img, currentTarget: div }
fire body.click with { target: img, currentTarget: body }
根据您正在执行的操作,您将需要一个或另一个属性。参考1的REF1
看起来不像是您提供的代码的结果。这是一个jQuery事件对象。它是Obj.caller.arguments
应该是什么?它是Obj.NoExplicitParametersFunc.caller.arguments,如果它不应该做任何事情,那么让我们关注一下它可以做什么,也会做什么;如果使用$.each(X.find(“option”)、Obj.NoExplicitParametersFunc调用它,则它===ObjNot代码>-您是否阅读了我链接的此
的MDN简介?链接不明显,不够微妙,无法准确解决问题。具有相同名称的本地参数是否也会发送到函数?$。每个(X.find(“选项”),对象NoExplicitParametersFunc);“局部参数”是什么意思?在<代码> Obj.Obj> <代码>函数中,“<代码> PAR1 >代码> >代码> PAR2> /CARD>变量将永远不可访问。您只能在函数调用中传递它们的值。请在感谢文章的中间检查摘要,得到它。请检查“总结”部分中更新的帖子。也许我只是对显而易见的事情感到困惑。谢谢
body - capturing
div - capturing
img - at target
div - bubbling
body - bubbling
fire body.click with { target: img, currentTarget: body }
fire div.click with { target: img, currentTarget: div }
fire img.click with { target: img, currentTarget: img }
fire div.click with { target: img, currentTarget: div }
fire body.click with { target: img, currentTarget: body }