【发布时间】:2016-04-01 05:58:14
【问题描述】:
我是一名 JS 新手,我正在阅读有关闭包的内容,由于误解闭包的工作原理而出现的常见问题以及“在循环中设置处理程序”就是一个很好的例子。我也看到并理解了解决这个问题的方法,即通过调用另一个函数,将循环变量作为参数传递并返回一个函数。然后我试了一下,看看是否有其他方法可以解决这个问题,我创建了以下代码。
var i;
var inpArr = new Array();
for(i = 0; i < 10; ++i) {
inpArr.push(document.createElement("input"));
inpArr[i].setAttribute("value", i);
inpArr[i].onclick = function() {
var index = i;
alert("You clicked " + index);
}
document.body.appendChild(inpArr[i]);
}
我猜它不起作用,但我不明白为什么。我了解i 已被捕获并可供生成的所有函数表达式使用。但是为什么把捕获的变量赋值给局部变量index之后还是不行呢?分配i 与将i 作为参数传递给另一个函数不同吗?我的意思是,i 不是原语,不应该被复制吗?
我很困惑,如果有人能告诉我这里发生了什么,我将不胜感激。
【问题讨论】:
-
每次单击时,
index的值将是i,i的值是9,因为click处理程序仅在loop结束后调用。尝试这个:jsfiddle.net/rayon_1990/sgtgfk8s
标签: javascript closures