为什么以下代码返回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
正确打印计数。答案 0 :(得分:0)
setTimeout()是一个异步函数
console.log('hey')
在打印之前不会等待它完成,因为JS是单线程的,它会等待程序运行,然后从事件队列中选择setTimeout()
let和var之间的区别可以在answer中找到。基本上因为let的范围仅限于for循环,所以setTimeout只能引用i的1个值。如果我们使用var那么它就是函数范围,每个函数都会获得相同的i
值