Maison > interface Web > js tutoriel > Pourquoi une boucle For avec setTimeout imprime-t-elle des valeurs inattendues ?

Pourquoi une boucle For avec setTimeout imprime-t-elle des valeurs inattendues ?

Patricia Arquette
Libérer: 2024-12-29 07:46:15
original
928 Les gens l'ont consulté

Why Does a For-Loop with setTimeout Print Unexpected Values?

La boucle For enveloppée dans setTimeout imprime des valeurs inattendues

Dans ce script, une boucle for itère avec la variable i de 1 à 2, et dans la boucle, une fonction de délai d'attente est définie avec un délai de 100 millisecondes pour alerter la valeur de i lors de son exécution. Cependant, le comportement attendu est que le script imprime 1 et 2 consécutivement, mais à la place, 3 est alerté deux fois.

Le comportement inattendu vient du fait que i est partagé tout au long de la boucle et est modifié au fur et à mesure de la boucle. progresse. Au moment où les fonctions de délai d'attente s'exécutent, i a déjà atteint 3, ce qui entraîne l'affichage de cette valeur par les deux alertes.

Pour résoudre ce problème et garantir des valeurs imprimées consécutives, il est nécessaire de créer des copies distinctes de i pour chaque fonction de délai d'attente. . Ceci peut être réalisé en définissant une fonction dédiée, doSetTimeout, qui prend i comme argument et définit le délai d'attente en utilisant cette valeur spécifique.

Le script modifié utilisant doSetTimeout est le suivant :

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);
Copier après la connexion

Avec cette modification, chaque itération de la boucle crée une nouvelle copie de i qui est transmise à doSetTimeout, garantissant que chaque timeout s'exécute avec la valeur correcte.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal