我向要遍历的某些元素添加了事件侦听器,并且需要关闭以将索引保留在事件函数中。
<button>solution 1</button>
<button>solution 2</button>
<script>
var buttons = document.getElementsByTagName('button');
for (var i = 0; i < 3; i++) {
var log = (function closure(number) {
return function () {
console.log(number);
};
})(i);
buttons[0].addEventListener("click", log);
}
for (var i = 0, len = 3; i < len; i++) {
(function (i) {
var log = function () {
console.log(i);
};
buttons[1].addEventListener("click", log);
})(i);
}
</script>
http://jsfiddle.net/paptd/11/
这两个解决方案都正确地输出0、1、2(尝试“错误”以查看在没有关闭的情况下会发生什么),但是我试图理解应该使用哪个以及为什么。
哪种方法是正确的方法?
最佳答案
第一个起作用是因为您正在定义一个闭包,从中返回一个函数,然后将该函数分配给侦听器。
第二个似乎更合适,因为闭包包含了整个循环的内容,这使得i
的值被“锁定”在那里更加明显。
关于javascript - 正确使用for循环中的闭包?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16940437/