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);
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!