Javascript jQuery each()-它在内部是如何工作的?

Javascript jQuery each()-它在内部是如何工作的?,javascript,jquery,Javascript,Jquery,我已经就此咨询了jQuery源代码,但我必须承认这可能超出了我的理解——或者我找错了地方。 在第222行附近有一个看起来是递归的函数,然后在第566行附近有另一个在.extend命名空间中声明的函数 我只是好奇——这到底是怎么回事?例如,当我打电话时: $('.item').each(function(){ // Do Something }); 它如何知道在DOM元素数组中循环,何时停止,如何应用函数?这不可能 $('.item').doThis() 因为doThis可能不是该对

我已经就此咨询了jQuery源代码,但我必须承认这可能超出了我的理解——或者我找错了地方。

在第222行附近有一个看起来是递归的函数,然后在第566行附近有另一个在.extend命名空间中声明的函数

我只是好奇——这到底是怎么回事?例如,当我打电话时:

$('.item').each(function(){
    // Do Something
});
它如何知道在DOM元素数组中循环,何时停止,如何应用函数?这不可能

$('.item').doThis()
因为doThis可能不是该对象的成员


请告诉我:谢谢。

据我所知,这

$('selector').each(func);
是否等同于这样做:

func = ...;
$selector = $('selector');
for (var i = 0; i < $selector.length; i++) {
    if (func.call($selector[i], i, $selector[i]) === false) {
        break;
    }
}
$('.item')[0] //The first item found by your query

$selection返回的对象实际上是一个DOM元素数组,附带了一大堆额外的方法,因此基本上可以像处理数组一样处理它。希望能把事情弄清楚

不,它不是递归的。上的函数是jQuery的原型$.fn上的函数,而它调用的函数是jQuery.each-中定义的静态属性。注意其工作原理:如果没有提供要扩展的对象,它将使用此方法。它在代码的不同部分都应用于jQuery和jQuery.fn

那么这到底是如何工作的呢

$obj.eachcallback正在调用$.fn.each方法,该方法将$.each应用于jQuery实例上的DOM包装本身:

现在,在$.each中,有四种情况:有或没有提供args数组,以及类似数组的结构或其他对象。您没有传递额外的参数,jQuery实例有一个length属性,并且在数字索引中有DOM元素,因此将执行循环。所以你的电话相当于

for (var i=0, len=$obj.length; i<len; i++)
    if ( callback.call($obj[i], i, $obj[i]) === false ) break;

在jQuery中执行的每个查询都存储为类似数组的对象,这意味着您可以通过执行以下操作访问查询找到的DOM元素列表:

func = ...;
$selector = $('selector');
for (var i = 0; i < $selector.length; i++) {
    if (func.call($selector[i], i, $selector[i]) === false) {
        break;
    }
}
$('.item')[0] //The first item found by your query

在内部,$.each使用$.each,这是一种遍历集合的方法,调用作为参数传递的函数,并使用“function.apply”将“this”设置为当前正在遍历的对象。

签出中的第566到605行


它是迭代的,并且相当简单

,这就是魔法发生的地方。。。任何地方都没有递归。我承认for循环看起来有点笨拙,但这一点也不奇怪。有没有试过阅读jQuery的源代码?那会更好。此外,90%在专业级别使用jQuery的人不知道它是如何工作的;真正的函数在566行。@Fratyr看到问题的第一句话了……我想知道为什么这样的问题被称为非建设性的……它非常方便……严格地说,它相当于func。调用$selector[I],I,$selector[I];。谢谢你的Felix,你说得对。谢谢-特别有帮助的是你弄清楚了哪个函数是哪个函数,扩展方法到底在做什么。很遗憾,这个线程被关闭了——我觉得更多的jQuery用户可以理解它的内部结构。有一件事仍然让我有点困惑,那就是迭代是如何发生的——例如,当我提供一个包含三项的数组时,如果它不是一个实参,那么这个数组是如何被带到each函数中的?它是$.each-obj的第一个实参。如果使用$.fn.each,则传递类似jQuery实例本身的数组。