2011-08-23 15 views

Odpowiedz

9

Można owinąć to w zamknięciu tak:

var vals = [1, 2, 3]; 

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

Spróbuj: http://jsfiddle.net/qgL7h/

+0

Dobra robota. Zauważyłem, że czasami numery były alarmowane w kolejności 1, 3, 2 (może jeden z 5 razy uruchomionych w Chrome 13) –

+0

Kolejność nie ma znaczenia i nie powinieneś polegać na kolejności setTimeout lub setInterval w każdym razie – 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 będzie działać, ale nie będzie poprawnej składni, ponieważ 'window.setTimeout' wymaga odniesienia do funkcji, a nie kodu do wykonania. – Tyilo

+0

Nie musisz nawet zwracać funkcji, wygląda na to - po prostu odpal "alert (i)" wewnątrz makeCallback – Blazemonger

+1

Spróbuj. makeCallback zwraca referencję do funkcji, więc zadziała. –

0

To nie jest bezwzględnie konieczne, aby przejść I do funkcji, może być przypisany do lokalny var wewnątrz.

var vals = [1, 2, 3]; 

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

Wymagane było "function() {block}()", ponieważ JavaScript nie miał odpowiednich zmiennych leksykalnych blokowych. Ostatnie edycje dodały "let", co umożliwia:

var vals = [1, 2, 3]; 

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