为什么下面的代码会在i的不同值上创建闭包?据我所知,闭包是当一个函数记住它的词法范围时,即使该函数在其词法范围之外执行。声明循环时,让我们创建一个名为i的块作用域变量。但是这个宣言发生了一次。从那个逻辑,我希望这个循环记录5 5 5 5 5,但它记录0 1 2 3 4.如果我在循环中声明了新变量,让j = i并将其传递给console.log(j),然后我会理解输出为0 1 2 3 4,因为每次迭代都会创建一个新的块范围变量,并且函数会关闭。但是,如果只为整个块范围创建一个i变量,那么下面如何关闭不同的i变量?我在这里缺少什么?
for(let i = 0; i<5;i++){
setTimeout(function(){
console.log(i);
},i*1000);
}
答案 0 :(得分:1)
为for循环的头部中使用的let声明定义了一个特殊的行为。这种行为表明变量将不仅仅为循环声明一次,而是每次迭代。并且,它将有助于在每次后续迭代中使用上一次迭代结束时的值进行初始化。
您可以从以下网址获取参考: https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20%26%20closures/ch5.md