为什么这个函数不会增加超时?

时间:2015-04-15 20:44:13

标签: javascript

我试图找出为什么这个脚本没有按i递增超时,这是我期望它做的:

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

这只记录10十次。 setTimeout应该可以访问i,功能也应该是我所知道的。尽管如此,它并没有像我期望的那样发挥作用。

这是fiddle

2 个答案:

答案 0 :(得分:1)

问题在于,当内部函数执行时,i的值为10,这就是你获得10次,10次的原因。

关闭&#39;关闭&#39;过度变量不超过值。这意味着闭包(setTimeout中的函数)在关闭时对变量的执行no时,可以访问变量创建了。

如此有效地执行以下代码:

var i;
for(i=0; i<10; i++ ){
}

// delay 0ms
console.log(i);
// some delay 
console.log(i);
// some delay 

....

还要记住,JS是一种单线程语言,所以第一个setTimeout不能执行,直到你&#34; yield&#34;,这意味着{{1}内的第一个函数}只在for循环结束时执行,并不意味着你在setTimeout

中指定的延迟有多小

答案 1 :(得分:0)

你需要了解关闭。以下是您的问题的解决方案:

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