2011-01-23 2 views
5

Quando si imposta un array di callback in questo modo ottengo 20 nella finestra di dialogo per tutti i callback. Mi piacerebbe ottenere l'indice nella matrice, invece. È possibile? La funzione che chiama il callback si aspetta che il callback abbia un parametro. Non controllo il chiamante del callback perché fa parte di una libreria esterna. Qualsiasi aiuto è apprezzato.Impostazione di un array di callback e tentativo di utilizzare indice di array come valore in callback

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

risposta

11

Perché i viene valutata quando viene chiamata la funzione, è necessario ambito che il valore di i in una nuova esecuzione della funzione, al fine di mantenere il valore che ci si aspetta.

 // 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

ho dovuto usare la funzione di parola chiave, invece di var per createFunction ma per il resto questo ha funzionato come un fascino. Grazie! – Xavier

+0

@Xavier: Questo è stato semplicemente sciatto da parte mia. Intendevo fare 'var createFunction = function (current_i) {...'. Fare una dichiarazione come 'function createFunction (...' è buona. – user113716

2

Un'altra soluzione che utilizza un oggetto.

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();

In questo caso sarà necessario chiamare la funzione (nell'esempio è stato chiamato "callback")