Javascript 循环的内部闭包

Javascript 循环的内部闭包,javascript,closures,Javascript,Closures,我知道使用此代码记录0到9的方法之一: 编辑: 但是我已经测试了在不传递I的情况下进行setTImeout自调用,它仍然有效: for(var i = 0; i < 10; i++) { setTimeout((function() { console.log(i); })(), 10) } for(变量i=0;i

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

编辑:

但是我已经测试了在不传递
I
的情况下进行
setTImeout
自调用,它仍然有效:

for(var i = 0; i < 10; i++) {
    setTimeout((function() {
      console.log(i);
    })(), 10)
}
for(变量i=0;i<10;i++){
setTimeout((函数(){
控制台日志(i);
})(), 10)
}

我的问题是:

  • 为什么它即使不作为参数传递
    i
    也能工作
  • 是否需要通过
    i
  • 问题 这不是结束

    for(var i = 0; i < 10; i++) {
      setTimeout((function(i) {
        console.log(i);
      })(i), 10)
    }
    
    它会立即执行,不会等待10毫秒。唯一的区别是您没有将
    i
    作为参数传递,但它将在父范围中查找名为
    i
    的变量,并且有一个

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

    解决方案 真正的结束是这样的:

    不带参数:您将看到10乘以10,因为在执行内部函数时,循环已经完成,这意味着此时i等于10:

    for(var i = 0; i < 10; i++) {
       (function() {
            setTimeout(function() {
             console.log(i);
          },10);
       })();
    }
    
    for(变量i=0;i<10;i++){
    (功能(){
    setTimeout(函数(){
    控制台日志(i);
    },10);
    })();
    }
    
    使用参数–您将获得预期结果:

    for(var i = 0; i < 10; i++) {
       (function(i) {
            setTimeout(function() {
             console.log(i);
          },10);
       })(i);
    }
    
    for(变量i=0;i<10;i++){
    (职能(一){
    setTimeout(函数(){
    控制台日志(i);
    },10);
    })(i) );
    }
    
    在所有avobe代码中,您正在执行setTimeout中作为第一个参数给出的函数,而不返回任何内容。因此,您返回的是
    未定义的

    在下面的代码中,我也进行了自调用,但返回了一个setTimeout函数,以便在特定的间隔
    I*10
    后执行

    这是闭包函数。检查控制台日志。它以毫秒为单位打印时间戳。有10毫秒的间隔

    for(变量i=0;i<10;i++){
    setTimeout((函数(i){
    返回函数(){
    log(i,performance.now()+'ms');
    }
    })(i) ,i*10)
    
    }
    您同样可以编写
    console.log(i);setTimeout(未定义,10)。那又怎么样?它不起作用。嗯,您有两个作用域:for循环和setTimeout。循环中有变量i,因此不需要将i传递给setTimeout;它已经被引用了。@JaeeunLee我的意思是,您的两个代码段都没有实际创建超时或异步记录值。@JaeeunLee:感谢您添加代码段的源代码。不幸的是,这是错误的!请看一看更好的参考资料(也许也可以)。请检查这一点,当然,但有什么意义,当您可以将
    setTimeout
    放在匿名函数中时?@torazaburo Buddy我已经更新了我的答案,以适应您的解释。请让我知道这是你提到的东西还是我遗漏了什么。谢谢!如果您还可以添加使其正常工作的方法,那就太好了。解决方案#1在创建时没有捕获
    i
    的价值,它仍然是一个终结吗?或者是吗?实际上闭包的本质是保存环境,保存一些变量和值,如第二个示例中所示。所以闭包的定义不仅仅是一个内部函数。所以如果你很严格,我会说不,第一个例子不是。第一个例子主要用于创建一个新的范围。否则,如果setTimeout在该函数内部或直接在for循环中,则输出是相同的。它们被立即调用函数表达式(IIFE)调用。
    for(var i = 0; i < 10; i++) {
       setTimeout((function() {
         console.log(i);
       })(), 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);
    }