箭头函数中的`var`和`let`行为

时间:2017-12-07 20:48:31

标签: javascript

为什么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);
}

2 个答案:

答案 0 :(得分:1)

它与箭头功能无关。 let是块级范围,因此每次进入循环体时,都会得到一个新变量。

在您的情况下,计时器功能的打印方式不同,因为在x。

周围创建了闭包

var提供了一个变量,循环的所有迭代(因此,所有计时器回调)共享,因此您获得每个计时器回调共享的变量的最后一个值。请记住,在循环结束之前,计时器回调将不会运行,并且此时x已递增到5。

由于块范围,让每个计时器回调它自己的值。因此,即使定时器回调在循环完成之前没有运行,每个回调都有一个围绕不同范围变量的闭包。

答案 1 :(得分:0)

  

让循环可以将它重新绑定到循环的每次迭代,制作   一定要重新分配上一循环结束时的值   迭代,因此它可以用来避免闭包问题。

在此处阅读更多内容:http://www.jstips.co/en/javascript/keyword-var-vs-let/