Je veux pousser des éléments dans une liste à l'aide d'une boucle et imprimez chaque étape avec un retard. Au lieu de cela, je reçois dans chaque itération la liste complète. Je suppose que c'est un problème d'étendue, mais je ne peux pas comprendre une solution.
Voici mon code: p>
function printNumber(num,i){ setTimeout(()=>console.log(num),500*i); } let numbers = [50]; for(let i=1; i<=10; i++){ printNumber(numbers,i); numbers.push(i); }
4 Réponses :
Vous remettez sur la matrice au lieu de la valeur.
function printNumber([...num], i) { setTimeout(() => console.log(...num), 500 * i); } let numbers = [50]; for (let i = 1; i <= 10; i++) { numbers.push(i); printNumber(numbers, i); }
Je pense que vous chercherez peut-être quelque chose comme dans le ci-dessous. La matrice inclut toutes les valeurs chaque itération car la boucle fonctionne à l'achèvement avant que le Étant donné que les tableaux sont stockés sous forme de références, Passer la fonction Un nouveau tableau la boucle résoudra ceci. p> p> settimeout code> commence à imprimer des choses.
num code> est muté par
numéros.push (i) code>. p>
function printNumber(num,i){
setTimeout(()=>console.log(num),500*i);
}
let numbers = [50];
for(let i=1; i<=10; i++){
// Create new array when you pass it here
printNumber([...numbers],i);
numbers.push(i);
}
C'est parce que JavaScript passe des tableaux par référence * , ce qui signifie que le rappel, qui fonctionne longtemps après la fin de la boucle est terminé, sera tout à jour, la valeur de la matrice.
Vous devez copier la matrice à chaque fois pour utiliser l'intermédiaire Etat. Vous pouvez appeler de sorte qu'il rendra une nouvelle copie de la matrice et des itérations ne se gâteront pas les unes avec les autres. P> * Voir Commentaire de Brian Thompson pour plus de précision P> p> printnumber code> de cette façon: p>
Votre solution est correcte mais votre titre de lien est faux. JavaScript est toujours passe-valeur, pas référence. En fait, l'une des meilleures réponses de la question que vous avez liées explique cela. La valeur i> détenue dans des variables pour des objets (y compris les tableaux) est i> une référence. Donc, il passe toujours la valeur i>, mais la valeur est une référence. C'est presque le même effet, sauf que cela signifie que la mutation accidentelle peut se produire sans jamais le transmettre à une fonction.
@Brianthompson correct! Édité ma réponse pour faire référence à votre commentaire (pas de jeu de mots)
Settimeout est une minuterie. Il exécutera quoi que ce soit à l'intérieur avec un retard. Cela ne met pas en pause le reste du code. Au moment où p> console.log code> Exécutez votre tableau est complet. Donc, il imprimera le tableau rempli.
let numbers = [50];
for(let i=1; i<=10; i++){
setTimeout(()=>{
console.log(numbers, i)
numbers.push(i);
},500*i);
}