- 我是新来的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);
}
for(var i=0; i< 10; i++) {
setTimeout(function(){
console.log(i);
}, 10);
}
这是因为封闭的,你应该做这样的事情
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
功能范围的新的变量,所以当超时来临的时候,它找到了自己的变量,并没有改变。
感谢您的回复......在这里我没有分配值对于j,但其如何对于j打印......我读您提供,但仍然我没有得到......你可以简单地告诉...对不起链接:( –
循环将在第一次setTimeout之前完成,甚至在什么时候触发'i'已经达到最大值 – charlietfl
@charlietfl我给了我<10但为什么它的打印10 –