2011-01-23 7 views
5

Po skonfigurowaniu tablicy wywołań zwrotnych w ten sposób otrzymuję 20 w oknie dialogowym dla wszystkich wywołań zwrotnych. Chciałbym zamiast tego uzyskać indeks w tablicy. czy to możliwe? Funkcja wywołująca wywołanie zwrotne oczekuje, że wywołanie zwrotne ma jeden parametr. Nie kontroluję wywołującego wywołania zwrotnego, ponieważ jest on częścią zewnętrznej biblioteki. Każda pomoc jest doceniana.Konfigurowanie tablicy wywołań zwrotnych i próby użycia indeksu tablicy jako wartości w oddzwonieniu

for (var i = 0; i < 20; i++) { 
    callbackDB[i] = function(data) { 
    alert(i); 
    } 
} 

Odpowiedz

11

Ponieważ i jest oceniany, gdy funkcja jest wywoływana, musisz zakresu że wartość i w nowej wykonania funkcji w celu utrzymania wartości można oczekiwać.

 // returns a function that closes around the `current_i` formal parameter. 
var createFunction = function(current_i) { 
    return function(data) { 
     alert(current_i); 
    }; 
}; 

    // In each iteration, call "createFunction", passing the current value of "i" 
    // A function is returned that references the "i" value you passed in. 
for (var i = 0; i < 20; i++) { 
    callbackDB[i] = createFunction(i); 
} 
+0

musiałem użyć funkcji słowa kluczowego zamiast var dla createFunction ale poza tym to działało jak czar. Dziękuję Ci! – Xavier

+0

@Xavier: To było po prostu niechlujstwo ode mnie. Zamierzałem zrobić 'var createFunction = function (current_i) {...'. Wykonywanie deklaracji jako 'function createFunction (...' też jest dobre. – user113716

2

Inne rozwiązanie za pomocą obiektu.

var callbackDB = new Array(); 
 

 
for (var i = 0; i < 20; i++) { 
 
    callbackDB[i] = { 
 
    value: i, 
 
    callback: function() { 
 
     alert(this.value); 
 
    } 
 
    }; 
 
} 
 
\t \t \t 
 
callbackDB[5].callback();

W tym przypadku będzie to konieczne, aby zadzwonić do funkcji (w przykładzie był to o nazwie „callback”)

Powiązane problemy