Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ecmascript 6 为什么';使用let(ES6)时,是否不需要使用闭包? //A.使用let var list=document.getElementById('list'); for(设i=1;i_Ecmascript 6 - Fatal编程技术网

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; ....)