使用带有var和let的setTimeout - 结果不同

时间:2017-08-15 17:23:35

标签: javascript

为什么以下代码返回10次10​​并打印hey作为第一行?

   for (var i = 0; i < 10; ++i) {
      setTimeout(() => console.log(i), 0)
    }
    console.log('hey')

如果我使用let,我会正确计算,但为什么总是先打印hey行?

 for (let i = 0; i < 10; ++i) {
      setTimeout(() => console.log(i), 0)
    }
    console.log('hey')

我的问题实际上包含两个:

  • 首先打印hey的原因。
  • 为什么使用let正确打印计数。

1 个答案:

答案 0 :(得分:0)

setTimeout()是一个异步函数

console.log('hey') 

在打印之前不会等待它完成,因为JS是单线程的,它会等待程序运行,然后从事件队列中选择setTimeout()

let和var之间的区别可以在answer中找到。基本上因为let的范围仅限于for循环,所以setTimeout只能引用i的1个值。如果我们使用var那么它就是函数范围,每个函数都会获得相同的i