2010-06-11 9 views
13
for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, function() 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

¿Cómo pasan somearray o uno de sus índices en la función anónima? somearray ya está en el ámbito global, pero aún así obtener somearray [i] no está definidoargumentos para la función JavaScript Anónimo

+0

este es un problema común - ver todas las preguntas relacionadas http: // stackoverflow. com/questions/tagged/javascript + closures + loops – Anurag

Respuesta

29

El i en la función anónima captura la variable de i, no su valor . Al final del ciclo, i es igual a somearray.length, por lo que cuando invoque la función, intenta acceder a una matriz de elementos no existente.

Puede solucionar este problema al hacer una función de la construcción de la función que captura el valor de la variable:

argumento
function makeFunc(j) { return function() { console.log(somearray[j][0]); } } 

for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, makeFunc(i)); 
} 

makeFunc 's podría haber sido nombrado i, pero me llamó j para mostrar que es una variable diferente que el utilizado en el ciclo.

+0

+1 para dar una buena explicación del problema, ¡y también para proporcionar una solución! – Matt

+0

Entiendo tu punto. Gracias. Pero simplemente no puedo entender cómo llamar a makeFunc. – Phonethics

+0

¡Impresionante! Tengo mi problema resuelto. ¡Esto es totalmente nuevo para mí en JavaScript! – Phonethics

-2

Todas las funciones/métodos se pueden utilizar como únicos devoluciones de llamada. Cuando llamas a la función de devolución de llamada, le pasas variables.

var myclass = { 
    foo: function(params, callback){ 
    // do some stuff 
    callback(variable1, variable1, variableN); 
    } 
} 
9

¿Qué tal un cierre:

for (var i = 0; i < somearray.length; i++) { 
    var val = somearray[i][0]; 
    myclass.foo({'arg1': val}, function(v) { 
     return function() {console.log(v) }; 
    }(val)); 
} 
0
for (var i = 0; i < somearray.length; i++) 

{ 
    myclass.foo({'arg1':somearray[i][0]}, function(somearray) 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

Y luego en el método llamado foo función anónima con el parámetro.

Cuestiones relacionadas