Phil's answer提供了一个很好的解决方案特定的您发布的代码(+1),但并未解释您的原始代码存在什么问题。
的问题是,事件处理倒闭得到持久参考到index
变量,而不是复制它如在创建时的。所以他们都看到index
的最终值(divs.length
)。例如,该超时发生时这个代码
for (index = 0; index < 4; ++index) {
setTimeout(function() {
console.log(index);
}, 100);
}
...将记录 “4” 的四倍,而不是 “0”, “1”, “2” 和 “3”。
要在通常情况下要确保您的处理程序关闭了特定值,请使用工厂函数为您生成事件处理程序函数,其中事件处理函数关闭通过您提供工厂的参数函数,而不是循环变量:
for(index=0; index<divs.length; index++) {
divs[index].addEventListener("click", createHandler(divs[index], true); //capture click event
}
function createHandler(div) {
return function(){
console.log(div.getAttribute("id"));
};
}
在那里,事件处理程序关闭了div
,这不会改变。
闭包是JavaScript中最强大的功能之一。一旦你明白了他们的工作方式(而且他们实际上比人们想象的要简单得多),你可以使用它们取得非常好的效果。更多:Closures are not complicated
阅读关于JavaScript闭包,并编辑您的代码。这是一个可变范围问题。 – DhruvPathak 2012-01-16 05:40:10