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

Était-ce utile?

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](); 
}​
  1. La fonction anonyme vous passez à AddToArray est lié à la i variable, et non la valeur actuelle. Pour y remédier, nous créons une nouvelle fonction, et passe dans la i actuelle.

  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top