我正在尝试学习JS,但遇到了一个问题。
我尝试了很多东西并在谷歌上搜索,但都是徒劳的。下面的一段代码无法按预期工作。我应该在点击时得到i
的值,但它总是返回6。我在拔头发;请帮忙。
for (var i = 1; i < 6; i++) {
console.log(i);
$("#div" + i).click(
function() {
alert(i);
}
);
}
jsfiddle
工作演示
这是一个典型的JavaScript闭包问题。对i
对象的引用存储在单击处理程序闭包中,而不是i
的实际值。
每个单击处理程序都会引用同一个对象,因为只有一个计数器对象包含6个,所以每次单击都会得到6个。
解决方法是将其封装在一个匿名函数中,并将i作为参数传递。基元在函数调用中按值复制。
for(var i=1; i<6; i++) {
(function (i) {
$("#div" + i).click(
function () { alert(i); }
);
})(i);
}
更新
更新的DEMO
或者您可以使用'let'代替var
来声明i
。let
每次都为您提供全新的绑定。它只能在ECMAScript 6 strict mode
中使用。
'use strict';
for(let i=1; i<6; i++) {
$("#div" + i).click(
function () { alert(i); }
);
}
问题是在循环中迭代时,i
会递增。它最终的值为6。当您说alert(i)
时,您要求javascript告诉您单击链接时i
的值是多少,此时为6。
如果你想得到盒子里的东西,你可以这样做:
for (var i = 1; i < 6; i++) {
console.log(i);
$("#div" + i).click(function(e) {
alert($(this).text());
});
}
div {
display: inline-block;
width: 15px;
height: 15px;
background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="div4">4</div>
<div id="div5">5</div>
$("#div" + i).click(
function() {
alert(i);
}
);
这是因为它使用i
的值作为闭包。i
是通过一个闭包来记住的,这个闭包在foor循环的每个阶段都会增加。
$("#div" + i).click(function(event) {
alert($(event.target).attr("id").replace(/div/g, ""));
});