//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
的价值?
谢谢。
答案 0 :(得分:1)
因为char_list
为let
循环的每次迭代定义了item
的新副本。它会在for
循环的每次迭代中自动为您创建一个单独的变量,因此您不必通过创建闭包手动执行此操作。
使用for
定义的变量是块作用域。因此,let
循环的每次迭代都是一个新块,因此是for
的新定义。
在let item
循环声明中使用let
时,如:
for
然后,对于for (let i = 1; ....)
循环的每次迭代,您还会获得i
的新副本,并且您不必使用闭包来保留for
中的该值。循环 - 这是自动完成的。