0

我想用JavaScript显示正在进行的编号。使用windows.setTimeout时丢失参数

为此,我开发了下面的例子:

for(var i=0; i<100; i++) { 
    window.setTimeout(function() { 
    alert(i); 
    },1000*i); 
} 

不幸的是,100号显示每次。我认为这是因为i是一个参考?

这怎么能改变参数传递?

+1

因此,您实际上在每次测试代码时都点击100个警报框? – Amberlamps 2013-02-11 12:07:17

+0

[Javascript闭包内循环 - 简单实用示例]的可能重复(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – 2013-02-11 12:22:45

回答

1

问题是JS不会在超时过期之前等待并继续完成循环。届时,i已经是100.

要解决此问题,您的超时应该有一个本地参考i。这样,它并没有引用当时已经为100的i,而是在循环的当时引用i

for(var i=0; i<100; i++) { 
    (function(i){ 
    //shadowing the loop-i with the function-i 
    window.setTimeout(function() { 
     //thus, this callback is referencing the i from the function 
     //and not the loop's i 
     alert(i); 
    },1000*i); 
    }(i)); 
}