关于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不同?

  • B是一个全局变量,由for循环计数(总是相同的变量B)。在for循环中声明了,因此对于每个迭代,都会得到一个具有新值的新实例。此实例可以在for循环内使用,并绑定到传递给settimeout的匿名函数。有关let:developer.mozilla.org/en-us/docs/web/javascript/reference/…的详细信息,请查看MDN。


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

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