Pregunta

Aquí está mi dilema.

Tengo esta sección de código:

var list_of_numbers = new Array();

function AddToArray(func)
{
    // Add to the *beginning* of the array
    // essentially reversing the order

    list_of_numbers.unshift(func);
}

function DisplayNumber(num)
{
    document.write(num);
}

for(var i=0;i<5;++i)
{
   AddToArray(function() { DisplayNumber(i); });
}

for(var i=0;i<5;++i)
{
   list_of_numbers[i]();
}​

¿Qué se supone que sucede es que las funciones en línea 5 se añadirán a la matriz - cada tomar una copia de i . Sin embargo, esto no sucede.

Resultados previstos:

  

43210

salida real:

  

01234

¿Fue útil?

Solución

Hay dos cuestiones separadas, ambas relacionadas con el alcance.

var list_of_numbers = new Array(); 
function AddToArray(func) 
{ 
    // Add to the *beginning* of the array
    // essentially reversing the order 
    list_of_numbers.unshift(func); 
} 

function DisplayNumber(num) 
{ 
    document.write(num); 
} 
for(var i=0;i<5;++i) 
{ 
    (function(i) 
     { 
         AddToArray(function(){ DisplayNumber(i); });
     })(i); 
} 

for(var j=0;j<5;++j) 
{ 
    list_of_numbers[j](); 
}​
  1. La función anónima estás pasando a AddToArray se une a la i variables, no el valor actual. Para hacer frente a esto, creamos una nueva función, y pase en el i actual.

  2. Javascript ámbito de la función, por lo que cuando se vuelva a declarar i en el segundo bucle, todavía se está modificando la misma variable. Por lo tanto, cambiar el nombre a j.

Si sólo el primer eran un problema, se llega a 55.555, ya que todas las funciones usarían la misma i, en ese punto 5. Sin embargo, ya que se vuelve a utilizar i para el segundo índice, i se establece en el índice de bucle de corriente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top