2016-01-21 75 views
4

我想在setTimeout的参数函数使用不同值(取决于循环索引)作为参数的循环内设置多个超时。这是一个simplificated例如:在使用setTimeout时将值传递给javascript中的函数

for(i=0; i<5; i++) 
{ 
    var m = setTimeout(function() {console.log(i)}, (i+1)*2000); 
} 

我认为与上面的代码我得到 “0,1,2,3,4” 每2秒。取而代之的是,我每2秒钟就会得到“5,5,5,5”。为什么?

回答

3

如果你感到快乐限制到现代Web浏览器的支持(即不IE 9和更早版本)以下将工作:

for(i=0; i<5; i++) 
{ 
    var m = setTimeout(function (i) {console.log(i)}, (i+1)*2000, i); 
} 

你可以通过你的变量作为第三个参数的setTimeout,然后接收它在你的setTimeout函数中。

至于为什么你的原始代码不起作用,它必须做这是相当不错这里解释的Javascript范围:What is lexical scope?

1

你需要一个包装函数来创建一个封闭和保持i值在迭代时间:

for(i=0; i<5; i++) { 
    (function(timeout) { 
     var m = setTimeout(function() {console.log(timeout)}, (timeout+1)*2000); 
    })(i)   
}