Le code suivant, je pensais qu'il produirait 1-10, mais la sortie est 5, et il continue de produire 5. C'est une boucle infinie, je ne la comprends pas. Merci!
function initloop() {
function doLoop(x) {
i = 3;
console.log(x);
}
for (var i = 0; i < 10; i++) {
doLoop(i + 1);
}
}
initloop();
Ce i équivaut en fait à être déclaré dans initloop.
Regardez les choses de cette façon, si vous pensez au processus d'exécution de la fonction, vous devriez comprendre.
Chaque fois que la boucle est bouclée, je serai modifié en 3 dans doloop
Une fois doloop exécuté, i++ est exécuté et le réel. les paramètres passés dans la boucle doivent être C'est 4 + 1 ;
Donc, la console est d'abord 1, puis elle continue à produire 5 dans une boucle infinie.
Si vous souhaitez afficher 1 à 10 comme vous le souhaitez, ajoutez var à i dans le doloop. Faites-en une variable locale.
La première boucle i=0, le paramètre réel du doloop i+1 est 1, donc la première sortie est 1. Comme il n'y a pas de variable i dans la fonction doloop, elle recherchera la variable i dans la portée externe, donc i=3 attribuera la valeur de i dans le corps de la boucle à 3. Une fois la première boucle terminée, puisque i<10, i++ vaut 4. À partir de la deuxième fois, i vaut 4, donc le paramètre réel de dooloop est 5. Parce que i se voit attribuer une valeur de 3 à chaque fois que la fonction dloop est exécutée, donc i est toujours inférieur à 10. Le résultat est 1 pour la première fois, puis imprime 5 en boucle.
J'ai d'abord essayé d'exécuter votre code, et le navigateur est resté bloqué deux fois... J'ai pleuré mon navigateur...
Pour cette raison, j'ai découvert que votre code est toxique...
Lors de l'exécution réelle, l'entrée est la suivante :
La première fois dans la boucle for,
i===0
, exécutedoLoop(1)
, donc à l'intérieur de la fonctiondoLoop
, le paramètre formelx===1, alors la valeur de i externe est modifiée et réinitialisée à3
, donc à ce momenti===3
, suivi de La valeur de x est imprimée, qui est1
.i===0
, 执行doLoop(1)
, 因此doLoop
函数内部, 形参x===1
, 接着又改变了外部i的值, 重置为3
, 故此时i===3
, 紧接着打印出了x的值, 即1
.for循环第二次时, 由于第一次循环结束时
i===3
, 发生自增操作, 即i++
. 故i最终等于4
.4+1=5
, 故执行doLoop(5)
,本次打印出了5
. 函数内部重复上一次的操作, 外部i变量再次被重置为3
,本次循环结束后i===5
.for循环第三次时, 重复上次操作, i再次被重置为
3
, 再次打印5
, 以此类推, 最终外层的for循环失效, 每次i的值都被重置为3
i===3
, une opération d'incrémentation se produit, c'est-à-direi++
. Par conséquent, i est finalement égal à4
4+1=5
, doncdoLoop(5)
est exécuté et5<.> est imprimé cette fois à l'intérieur de la fonction Répéter la dernière opération, la variable externe i est réinitialisée à
3
, et après la fin de ce cycle,i===5<.>. 🎜🎜Pour la troisième fois dans la boucle for, la dernière opération est répétée, i est réinitialisé à
3
à nouveau,5
est à nouveau imprimé, et ainsi de suite, le dernier extérieur for loop Invalid, la valeur de i est réinitialisée à3
à chaque fois et la condition de fin de boucle ne peut pas être remplie. Par conséquent, la boucle ne peut pas se terminer. Par conséquent, le navigateur se bloque.🎜🎜. 🎜 🎜Pour résumer, cette façon d'écrire est problématique. Essayez de ne pas modifier les variables en dehors de la fonction à l'intérieur de la fonction.🎜Chaque fois que la boucle boucle, i se voit attribuer une valeur de 3, et i dans la fonction dloop n'est pas une variable privée, donc i dans initloop se voit attribuer une valeur de 3 à chaque fois. La prochaine fois que i++ est bouclé, i devient. 4 et passé dans le dloop Naturellement, chaque valeur imprimée est 5. Après l'avoir résolue, dloop change i en 3. i ne sera jamais égal à 10, donc la boucle est sans fin
.