为什么jQuery的每个循环函数都保存了对元素对象的引用

最近我发现jQuery在each循环的函数中保存一个变量,如果它已经使用jQuery对象引用设置的话。 例如,在每个方法的第二次和第三次迭代期间, $elem值保持不变,并且它指的是第一个div。

 $("div").each(function(index) { //below $elem is initialized with div reference during first iteration if (index === 0) $elem = $(this); var text = "index: " + index + ", $(this).html(): " + $(this).html() + ", elem.html(): " + $elem.html() + ""; $("#output").append("
  • " + text + "
  • "); });
     li span { color: blue; } li span:nth-child(2) { color: red; } li span:nth-child(4) { color: green; } 
      
    1 DIV
    2 DIV
    3 DIV

    jQuery each loop's output:

      我很惊讶在each循环的第二次迭代期间$elem不会变为nullundefined 。 在该行为之后,输出具有文本:每三行上有1个DIV 。 有没有人知道为什么$elem在每种方法的第二次和第三次迭代中引用第一个div ? – 谢谢

      有没有人知道为什么$ elem在每种方法的第二次和第三次迭代中引用第一个div?

      因为您在第一次迭代中设置了全局变量$elem ,并且此变量以后永远不会更改。 所以在循环和后循环完成后,这个变量将指向第一个div jQuery对象。

      永远不要忘记用var关键字声明变量。 未声明但初始化的变量成为全局变量。 正如您所看到的,它可能导致混乱和错误。

      这是因为varialbe默认情况下没有词法范围。 如果它被声明为

       var $elem 

      相反,每次运行该函数时它都会被重置为undefined。

      有关更多信息,请参见变量语句开发人员页面