2011-08-23 52 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); 
}