Javascript “的目的是什么?”;self.each(回调,数组)";在jQuery源代码中?
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代码中,我们看到了以下内容:
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);
}