Comment accéder à cette variable dans une fonction en ligne?
-
30-09-2019 - |
Question
Voici mon dilemme.
J'ai cette section de code:
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]();
}
Ce qui est censé se produire est que 5 fonctions en ligne seront ajoutés au tableau - chaque prendre une copie de i
. Toutefois, cela ne se produit pas.
Résultats attendus:
43210
sortie réelle:
01234
La solution
Vous avez deux questions distinctes, toutes deux liées au champ.
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 fonction anonyme vous passez à
AddToArray
est lié à lai
variable, et non la valeur actuelle. Pour y remédier, nous créons une nouvelle fonction, et passe dans lai
actuelle. -
JavaScript a une portée de fonction, donc quand vous re-déclarer
i
dans la deuxième boucle, vous modifiez toujours la même variable. Ainsi, on renomme àj
.
Si seul le premier était un problème, vous obtiendrez 55555, puisque toutes les fonctions utiliseraient la même i
, à ce point 5. Cependant, étant donné que vous réutilisez i
pour le second indice, i
est réglé sur l'indice de boucle de courant.