【问题标题】:Asynchronous scope [duplicate]异步范围 [重复]
【发布时间】:2018-05-23 05:39:22
【问题描述】:

有些东西我不是很清楚,如果有人可以帮助我:

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)。 a 在您的 for 循环中声明,因此对于每次迭代,您都会获得具有新值的 a 的新实例。此实例可在您的 for 循环中使用,并绑定到传递给 setTimeout 的匿名函数。查看 MDN 了解有关 let 的详细信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript asynchronous


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2013-02-22
    • 2021-03-28
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多