Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.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 “的目的是什么?”;self.each(回调,数组)";在jQuery源代码中?_Javascript_Jquery - Fatal编程技术网

Javascript “的目的是什么?”;self.each(回调,数组)";在jQuery源代码中?

Javascript “的目的是什么?”;self.each(回调,数组)";在jQuery源代码中?,javascript,jquery,Javascript,Jquery,jQuery的。每个函数只接受一个参数—一个函数。然而,在这段jQuery代码中,我们看到了以下内容: if ( callback ) { self.each( callback, [ responseText, status, jqXHR ] ); } 正在将两个参数传递给。每个。我假设括号中的值是回调函数的参数,但我不清楚为什么会这样,为什么会有人这样做而不是直接调用函数 if ( callback ) { self.each( callback(responseText,

jQuery的
。每个
函数只接受一个参数—一个函数。然而,在这段jQuery代码中,我们看到了以下内容:

if ( callback ) {
    self.each( callback, [ responseText, status, jqXHR ] );
}
正在将两个参数传递给
。每个
。我假设括号中的值是回调函数的参数,但我不清楚为什么会这样,为什么会有人这样做而不是直接调用函数

if ( callback ) {
    self.each( callback(responseText, status, jqXHR) );
}
“我不清楚为什么这是可能的,为什么有人会这样做…”

他们不会。仅供内部使用:

这种行为随时可能改变


明确地说,通常对每个对象的回调都会得到两个参数:

  • 集合的
    i
    (属性名称或索引)作为第一个

  • i
    处项目的值作为第二个

但有时在内部,他们希望使用
每个
迭代器,但他们不需要这些参数,而是希望替换自己的参数

这就是正在发生的事情。您可能会发现,如果已为内部
args
属性指定了一个值,则它们会对传递给定args的集合进行稍微不同的迭代

他们也这样做:

callback.apply( object[ name ], args )
…而不是:

callback.call( object[ name ], name, object[ name ] )
…或稍有不同,但对于类似数组的集合实际上是相同的


您可以自己测试它:

 // normal usage
$('p').each(function( a, b, c ) {

     // will show the index, the element, and undefined for each "p" element
    console.log( a, b, c ); 

});

 // internal usage
$('p').each(function( a, b, c ) {

     // will show 1, 2, 3 once for every "p" element
    console.log( a, b, c );

}, [ 1, 2, 3 ] );
但同样,这种行为不是供公众使用的,可能会在没有警告的情况下发生变化。

回答了这个问题的一部分–每个
调用是如何工作的。这就是为什么需要它

if ( callback ) {
    self.each( callback(responseText, status, jqXHR) );
}
该代码不起作用,因为它将调用
回调
一次,然后将其结果用作每个
调用的参数。它近似等于

callback(responseText, status, jqXHR);
self.each ( true );
下一个选项是使用匿名函数执行此操作:

self.each (function() {
    callback(responseText, status, jqXHR);
});
这很好用。但是,您缺少功能。您的回调运行的次数是正确的,但是没有什么可以区分每个迭代。您不妨这样做:

for (var i = 0; i < self.length; i++) {
    callback(responseText, status, jqXHR);
}
for(变量i=0;i

通过像原始代码一样使用
每个
,当调用
回调
时,数组中的相关元素被用作“上下文”——实际上是函数中该
的值。这意味着代码可能会根据传递选择中的哪个元素而有所不同。

假设
callback
返回一个字符串<代码>self.each(回调(responseText,status,jqXHR))
实际上与
var s=callback(responseText,status,jqXHR)相同;自我保护。每个(s)这根本不起作用。值得强调的是,“仅限内部使用”并不意味着有什么东西可以阻止你使用它;这意味着它不应该被使用,而且它的存在是没有文档记录的,没有任何东西可以阻止jQuery在以后的版本中更改/删除它的实现,而不事先通知。@RightSaidFred-谢谢,回答很好+1我没有密切注意回调的立即调用,而不是传递回调。除非它返回一个函数,否则这显然是行不通的。@lonesomeday-非常感谢-你和RightSaid都给出了很好的答案,希望我能给你们两个信任。
for (var i = 0; i < self.length; i++) {
    callback(responseText, status, jqXHR);
}