setTimeout中let和var的区别?

Muk*_*mar 9 javascript ecmascript-6

我知道let和var之间的区别.let是块范围,var是功能范围.

for(var i=0; i< 3; i++){
    setTimeout(function(){
        console.log(i);
    }, 10);
}

output : 3
         3
         3
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码片段是如何工作的(console.log(i)当i的值为3时,正在执行,因为i的范围是全局的).

for(let i=0; i< 3; i++){
    setTimeout(function(){
        console.log(i);
    }, 10);
}

output : 1
         2
         3
Run Code Online (Sandbox Code Playgroud)

上面的代码片让我很困惑.根据我的说法它应该抛出引用错误(因为console.log(i)执行时的时间,将在全局范围内查看i的值而不是在本地范围内,并且我不在全局范围内声明/定义.因此它应该给出引用错误.)

谁能解释第二个循环如何在Runtime上工作?

Bad*_*bra 4

当您let在此上下文中使用时,每次迭代都会创建一个新的绑定/范围。如果你想在 ES5 中使用 实现类似的行为var,你必须使用 IIFE:

for (var i = 0; i < 3; i++) {
  (function (i) {
    setTimeout(function () {
      console.log(i);
    }, 10);
  })(i);
}
Run Code Online (Sandbox Code Playgroud)