Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript闭包:隐式参数,调用方_Javascript_Dom_Closures_Prototypal Inheritance - Fatal编程技术网

javascript闭包:隐式参数,调用方

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

我需要一些关于javascript调用元数据的说明。下面提供的代码具有SenderAsParameterFunc和NoExplicitParametersFunc,它们是从另一个函数的each循环调用的

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 }