使用let(ES6)时为什么不需要使用闭包?

时间:2017-05-29 02:35:19

标签: ecmascript-6

//A.Using let
var list = document.getElementById('list');

for (let i = 1; i <= 5; i++) {
    let item = document.createElement('li');
    item.appendChild(document.createTextNode('Item ' + i));

    item.onclick = function(ev) {
       console.log('Item ' + i + ' is clicked.');
    };
    list.appendChild(item);
}


//B. Using var
// to achieve the same effect with 'var'
// you have to create a different context
// using a closure to preserve the value
for (var i = 1; i <= 5; i++) {
    var item = document.createElement('li');
    item.appendChild(document.createTextNode('Item ' + i));

    (function(i){  
        item.onclick = function(ev) {
            console.log('Item ' + i + ' is clicked.');
        };
    })(i);
    list.appendChild(item);
}
题:

与B部分一样,闭包用于保留i的值,但在使用let的A部分中不需要闭包。 let如何帮助保留i的价值? 谢谢。

1 个答案:

答案 0 :(得分:1)

因为char_listlet循环的每次迭代定义了item的新副本。它会在for循环的每次迭代中自动为您创建一个单独的变量,因此您不必通过创建闭包手动执行此操作。

使用for定义的变量是块作用域。因此,let循环的每次迭代都是一个新块,因此是for的新定义。

let item循环声明中使用let时,如:

for

然后,对于for (let i = 1; ....) 循环的每次迭代,您还会获得i的新副本,并且您不必使用闭包来保留for中的该值。循环 - 这是自动完成的。