我向要遍历的某些元素添加了事件侦听器,并且需要关闭以将索引保留在事件函数中。

<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/

10-15 14:32