2011-08-23 39 views
6

如何使此javascript警报0,1和2而不是3 3?如何使用本地参数进行匿名函数

var vals = [1, 2, 3]; 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(function() {alert(i);}, 1000); 
} 

我知道为什么它这样做的原因,但我无法弄清楚,如何通过i匿名函数。

回答

9

您可以像这样在一个封闭包装这个:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function(num) { 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(i); 
} 

试试:http://jsfiddle.net/qgL7h/

+0

不错的工作。我注意到,有时候这些数字会按照1,3,2的顺序发出警报(可能是Chrome 13中运行它的5次之一) –

+0

顺序无关紧要,您不应该依赖setTimeout的顺序或者无论如何setInterval – Tyilo

3
var vals = [1, 2, 3]; 
function makeCallback(i) 
{ 
    return function() {alert(i);}; 
} 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(makeCallback(i), 1000); 
} 
+0

IT工作,但不是有效的语法'window.setTimeout'需要一个函数参考,不执行代码。 – Tyilo

+0

你甚至不需要返回一个函数,看起来 - 只需发出警报(i)'在makeCallback内部 – Blazemonger

+1

试试吧。 makeCallback返回一个函数引用,所以它会工作。 –

0

这不是绝对必要的,以我传递给函数,它可以被分配给本地var内部。

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function() { 
     var num = i 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(); 
} 

“function(){block}()”是必需的,因为Javascript没有合适的块词法变量。最近的版本增加了“让”,这使这成为可能:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    let num = i 
    window.setTimeout(function() {alert(vals[num]);}, 1000); 
}