Ecmascript 6 为什么';使用let(ES6)时,是否不需要使用闭包? //A.使用let var list=document.getElementById('list'); for(设i=1;i
,因为Ecmascript 6 为什么';使用let(ES6)时,是否不需要使用闭包? //A.使用let var list=document.getElementById('list'); for(设i=1;i,ecmascript-6,Ecmascript 6,,因为let为for循环的每次迭代定义了项的新副本。它在for循环的每次迭代中自动为您创建一个单独的变量,因此您不必手动创建闭包 用let定义的变量是块范围的。因此,for循环的每次迭代都是一个新块,因此是let项的新定义 当您在for循环的声明中使用时,请让,如下所示: //A.Using let var list = document.getElementById('list'); for (let i = 1; i <= 5; i++) { let item = docum
let
为for
循环的每次迭代定义了项的新副本。它在for
循环的每次迭代中自动为您创建一个单独的变量,因此您不必手动创建闭包
用let
定义的变量是块范围的。因此,for
循环的每次迭代都是一个新块,因此是let项的新定义
当您在for
循环的声明中使用时,请让,如下所示:
//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);
}
然后,对于for
循环的每次迭代,您也会得到一份新的i
,而且您不必使用闭包来在for
循环中保留该值-这是自动完成的。哦……没错……谢谢您的快速响应:)“闭包用于保留i
”否!闭包与解决方案无关。重要的是,您正在执行一个函数(在每次迭代中)并因此创建一个新范围(每次迭代)。函数是否为闭包无关紧要。
for (let i = 1; ....)