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

Yar*_*rin 3 javascript jquery

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

if ( callback ) {
    self.each( callback, [ responseText, status, jqXHR ] );
}
Run Code Online (Sandbox Code Playgroud)

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

if ( callback ) {
    self.each( callback(responseText, status, jqXHR) );
}
Run Code Online (Sandbox Code Playgroud)

Rig*_*red 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 );
},
Run Code Online (Sandbox Code Playgroud)

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


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

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

  • i作为第二个项目的值

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

这就是发生的事情.你可以在这里看到,如果内部args属性被赋予了一个值,它们会对通过给定的args的集合进行稍微不同的迭代.

所以他们这样做:

callback.apply( object[ name ], args )
Run Code Online (Sandbox Code Playgroud)

...代替:

callback.call( object[ name ], name, object[ name ] )
Run Code Online (Sandbox Code Playgroud)

...或稍微不同的东西,但对于类似数组的集合实际上是相同的.


您可以自己测试它:

 // 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 ] );
Run Code Online (Sandbox Code Playgroud)

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