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);
}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...