微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 关闭里面的循环

我知道使用此代码将0到9记录的方法之一:

编辑:Source

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

jsfiddle

是使setTimeout自我调用并将i作为参数传递,如下所示:

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

但我已经测试过setTImeout自我调用而不传递i,它仍然有效:

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

jsfiddle

我的问题:

>为什么即使不将i作为参数传递也能工作?
>是否有必要通过我?

解决方法

问题

这不是关闭.

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

setTimeout实际上需要一个函数作为参数,但是你让它立即调用.所以它立即记录i的值,而不是等待. setTimeout现在已将您的匿名函数作为第一个参数返回,该参数未定义.

和这里一样:

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

它立即执行,不等待10ms.唯一的区别是你没有将i作为参数传递,但是它将在父作用域中查找名为i的变量 – 并且只有一个.

如果您将时间设置为例如,您将看到立即调用您的匿名函数一秒钟(1000).

真正的闭包看起来像这样:

没有参数:你会看到10次10​​,因为在执行内部函数时循环已经完成,这意味着当时我等于10:

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

使用参数 – 您将获得预期的结果:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐