最近我发现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>
我很惊讶$elem
在null
循环的第二次迭代期间没有成为undefined
或each
。在该行为之后,输出在每三行上都有文本: 1 DIV 。有没有人知道为什么$elem
在每种方法的第二次和第三次迭代中引用第一个div
? - 谢谢
答案 0 :(得分:2)
有没有人知道为什么$ elem在每种方法的第二次和第三次迭代中引用第一个div?
因为您在第一次迭代中设置了全局变量$elem
,并且此变量以后永远不会更改。所以在循环和完成循环之后,这个变量将指向第一个div
jQuery对象。
永远不要忘记使用var
关键字声明变量。未声明但初始化的变量成为全局变量。如您所见,它可能导致混淆和错误。
答案 1 :(得分:1)
这是因为varialbe默认情况下没有词法范围。如果它被声明为
var $elem
相反,每次运行该函数时它都会被重置为undefined。
有关详细信息,请参阅variable statement开发人员页面。