jQuery源代码中“self.each(callback,array)”的目的是什么?

时间:2011-12-07 21:46:06

标签: javascript jquery

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

if ( callback ) {
    self.each( callback, [ responseText, status, jqXHR ] );
}

两个参数传递给.each。我假设括号中的值是回调函数的参数,但是我不清楚为什么这是可能的以及为什么有人会这样做而不是直接调用函数? :

if ( callback ) {
    self.each( callback(responseText, status, jqXHR) );
}

2 个答案:

答案 0 :(得分:11)

  

“我不清楚为什么这是可能的以及为什么有人会这样做......”

他们不会。它仅供内部使用:https://github.com/jquery/jquery/blob/1.6.2/src/core.js#L248-253

// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
    return jQuery.each( this, callback, args );
},

此行为可能随时发生变化。


要清楚,通常你对每个回调都有两个参数:

  • 作为第一个

  • 的集合的i (属性名称或索引)
  • i项目的值为第二个

但有时在内部他们想要使用each迭代器,但他们不需要这些参数,而是他们想要替换它们自己。

这就是发生的事情。你can see here如果内部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 ] );

但同样,这种行为不适合公众使用,可能会在没有任何警告的情况下发生变化。

答案 1 :(得分:2)

RightSaidFred已回答了此问题的一部分 - each来电如何运作。这是为什么需要它。

if ( callback ) {
    self.each( callback(responseText, status, jqXHR) );
}

该代码无效,因为它会调用callback一次,然后使用该结果作为each调用的参数。它是

的近似值
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);
}

通过使用each作为原始代码,当调用callback时,数组中的相关元素将用作“上下文” - 实际上,{{1}的值在函数内。这意味着代码可以根据选择中的哪个元素传递而不同。