¿Cómo acceder a esta variable en una función en línea?
-
30-09-2019 - |
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
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]();
}
-
La función anónima estás pasando a
AddToArray
se une a lai
variables, no el valor actual. Para hacer frente a esto, creamos una nueva función, y pase en eli
actual. -
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 aj
.
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.