2017-04-02 95 views
0
  • 我是新来的js
  • 我想下面的代码将输出0,1,2,3, 4,5,6,7,8,9间隔10毫秒。
  • ,但它没有像印刷,它的印刷10个十倍。
  • 是由于设置了超时或其他什么东西?
  • 你们可以告诉我,为什么它的发生......这将有助于我这么多的了解JS
for(var i=0; i< 10; i++) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 10); 

} 
+0

循环将在第一次setTimeout之前完成,甚至在什么时候触发'i'已经达到最大值 – charlietfl

+0

@charlietfl我给了我<10但为什么它的打印10 –

回答

1

这是因为封闭的,你应该做这样的事情

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

这是基本的JavaScript关闭,你可以在这里阅读更多How do JavaScript closures work?

的问题是,for循环结束第一,所以在最后,i将等于10.之后,setTimeout函数将被调用,当他们检查i的值时,他们会发现它等于来自for循环的最后一个值,即为10. 我所做的操作称为IIFE (Immediately Invoked Function Expression),它创建为setTimeout功能范围的新的变量,所以当超时来临的时候,它找到了自己的变量,并没有改变。

+0

感谢您的回复......在这里我没有分配值对于j,但其如何对于j打印......我读您提供,但仍然我没有得到......你可以简单地告诉...对不起链接:( –