异步范围

时间:2017-12-08 23:09:39

标签: javascript asynchronous

有些事情我没有清楚地理解,如果有人可以帮助我:

let arr = [1,2,3,4,5,6,7];

let b = 0
for (let a of arr) {
    setTimeout(() => {
        console.log(b, a)
    }, 2000)
    b = b + 1;
}
/* Output 
7 1
7 2
7 3
7 4
7 5
7 6
7 7
*/

我们说b等于7,因为2秒后,变量b等于7,那么为什么a的行为与{{1}不同}

1 个答案:

答案 0 :(得分:1)

区别在于范围变量如何与let关键字一起使用。在这种情况下,您将为循环的每次迭代定义一个新的a。但是每次迭代都是相同的b变量。

在循环结束之前,超时实际上不会开始触发。到目前为止,每个超时函数范围都被赋予了不同的a,但是获取了b的相同最终值。