为什么i
在箭头函数中表现不同?是因为var x
正在被重新分配,而let x
是为每次迭代创建新的吗?
//prints 55555
for(var x = 0; x < 5;x++){
setTimeout(()=>console.log(x),0);
}
//prints 01234
for(let x = 0;x < 5;x++){
setTimeout(()=>console.log(x),0);
}
答案 0 :(得分:1)
它与箭头功能无关。 let是块级范围,因此每次进入循环体时,都会得到一个新变量。
在您的情况下,计时器功能的打印方式不同,因为在x。
周围创建了闭包var提供了一个变量,循环的所有迭代(因此,所有计时器回调)共享,因此您获得每个计时器回调共享的变量的最后一个值。请记住,在循环结束之前,计时器回调将不会运行,并且此时x已递增到5。
由于块范围,让每个计时器回调它自己的值。因此,即使定时器回调在循环完成之前没有运行,每个回调都有一个围绕不同范围变量的闭包。
答案 1 :(得分:0)
让循环可以将它重新绑定到循环的每次迭代,制作 一定要重新分配上一循环结束时的值 迭代,因此它可以用来避免闭包问题。
在此处阅读更多内容:http://www.jstips.co/en/javascript/keyword-var-vs-let/