关于javascript:异步范围

Asynchronous scope

本问题已经有最佳答案,请猛点这里访问。

如果有人能帮我的话,我真的不太明白:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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的行为与b不同?


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

直到循环结束后,超时才开始触发。这时,每个超时函数的作用域都被赋予了不同的a,但获取的最终值与b相同。