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

时间:2015-02-21 10:31:36

标签: javascript 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: <span>" + index + ",</span> <span>$(this).html():</span> <span>" +     $(this).html() + ",</span><span> elem.html():</span> <span>" + $elem.html() + "</span>";

   $("#output").append("<li>" + text + "</li>");
 });
li span {
   color: blue;
 }
 li span:nth-child(2) {
   color: red;
 }
 li span:nth-child(4) {
   color: green;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>1 DIV</div>
<div>2 DIV</div>
<div>3 DIV</div>
<br />jQuery each loop's output:
<ul id="output"></ul>

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

2 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:1)

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

var $elem

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

有关详细信息,请参阅variable statement开发人员页面。