我正在向我正在循环的一些元素添加一个事件侦听器,并且需要一个闭包以保留事件函数中的索引。
<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>
这两种解决方案都正确输出 0、1、2(尝试“错误”以查看没有关闭会发生什么),但我试图了解我应该使用哪一个以及为什么。
哪种方式是正确的做法?