javascript - 关于 JavaScript 闭包中立即执行函数

标签 javascript jquery loops closures

var funcs=[];
for(var i=0;i<3;i++){

  funcs[i]=function(){
    console.log(i);
    };
  }
for(var j=0;j<3;j++){
  funcs[j]();
  }

这样,我知道它会提醒所有3。因为这些函数是在我分配给3之后调用的。

但是在下面的代码中,我无法理解为什么会发生这种情况。

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

在我看来,当 i 被赋值为 0 时,第一个函数 setTimeout 会在 i 被赋值为 1 之前执行。

我这个循环的顺序错了吗?

最佳答案

console.log(i) 将在 for 循环完成后被调用,由于 var 的方式,for 循环是函数作用域的。当它到达console.log语句时(2000毫秒)将是10。给出预期结果的一种方法是使用 let 而不是 var。但是,您将使用 let 删除一些浏览器支持。

关于这个主题的好读物是 getify's "You Don't Know Js" book .

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

关于javascript - 关于 JavaScript 闭包中立即执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498320/

相关文章:

javascript - 让 setInterval 处理 html 列表项中的子元素

jquery - 每 10 秒发射一次

python - 迭代相同长度的行文件的每个字符串的索引,同时从各个索引创建每个值的新字符串

python - 遍历 Pandas 数据框的行

JAVA FileOutputStream 覆盖最后一个字符

javascript - ajax 返回 true,但 == 返回 false

javascript - AngularJS 表单验证 - formName.$valid 始终为真

javascript - 在 CKEditor 中加载 blockquote 插件

javascript - `TypeError: Cannot read property ' 运动ID ' of undefined`

javascript - 更改以下同名项目