【发布时间】:2017-11-20 06:30:35
【问题描述】:
我知道 let 和 var 之间的区别。 let 是块作用域,var 是函数作用域。
for(var i=0; i< 3; i++){
setTimeout(function(){
console.log(i);
}, 10);
}
output : 3
3
3
我知道上面的代码 sn-p 是如何工作的(console.log(i) 在 i 的值为 3 时执行,因为 i 的范围是全局的)。
但是
for(let i=0; i< 3; i++){
setTimeout(function(){
console.log(i);
}, 10);
}
output : 1
2
3
上面的代码 sn-p 让我很困惑。根据我的说法,它应该抛出引用错误(因为console.log(i)执行的时间会在全局范围内而不是在本地范围内查看i的值,并且我没有在全局范围内声明/定义。所以它应该给出引用错误。)
谁能解释第二个 for 循环如何在运行时工作?
【问题讨论】:
-
在使用 let 时,闭包会在每次迭代中关闭 i 的新实例。
-
如果
Reference Error会被抛出,那么任何一种关闭都不会起作用。既不是函数范围var的那个,也不是let的那个。 -
有空的时候去看看这个article。它很好地解释了作用域、提升等。