javascript - setTimeout 中 let 和 var 的区别?

标签 javascript ecmascript-6

<分区>

我知道 let 和 var 的区别。 let 是 block 作用域,var 是函数作用域。

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

output : 3
         3
         3

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

但是

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

output : 1
         2
         3

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

任何人都可以解释 2nd for 循环如何在运行时工作?

最佳答案

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

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

关于javascript - setTimeout 中 let 和 var 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44606868/

相关文章:

javascript:switch 语句中的常用命令

javascript - $injector :modulerr AngularJS, 到目前为止尝试了一切

javascript - React-Apollo,不要在组件加载时运行查询

java - typescript 枚举的构造函数?

javascript - 使用嵌套 var 的 block 作用域显示不同的错误

javascript - 使用 es6 根据匹配和不匹配的值对数组进行排序

javascript - 讲话泡泡 html5 Canvas js

c# - 在 asp.net 中的 javascript 中使用 c# 字符串属性

javascript - 错误 : cannot find module when testing with mocha

javascript - 无法在 useRouteMatch 中声明 url 和路径变量