2011-08-23 14 views
6

¿Cómo hago esta alerta de Javascript 0, 1 y 2 en lugar de 3 3?Cómo realizar funciones anónimas con parámetros locales

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

sé la razón por la que hace esto, pero no puedo averiguar, cómo pasar i a la función anónima.

Respuesta

9

Puede terminar con esto en un cierre de este modo:

var vals = [1, 2, 3]; 

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

Práctica: http://jsfiddle.net/qgL7h/

+0

Buen trabajo. Noté que a veces los números eran alertados en el orden 1, 3, 2. (tal vez una de cada 5 veces lo ejecuta en Chrome 13) –

+0

El orden no importa, y no debe confiar en el orden de setTimeout o setInterval de todos modos – 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 funcionará pero la sintaxis válida como 'window.setTimeout' requiere una referencia de función, no un código para ejecutar. – Tyilo

+0

Ni siquiera tiene que devolver una función, al parecer, simplemente ejecute 'alert (i)' dentro de makeCallback – Blazemonger

+1

Pruébelo. makeCallback devuelve una referencia de función, por lo que funcionará. –

0

No es estrictamente necesario pasar i para la función, que puede ser asignado a una var local dentro.

var vals = [1, 2, 3]; 

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

La "función() {bloque}()" era necesaria, porque Javascript no tenía las variables léxicas de bloque adecuadas. Las ediciones recientes han agregado "let", que lo hace posible:

var vals = [1, 2, 3]; 

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