Veuillez analyser | Pourquoi la sortie de ce code JavaScript est-elle 5 ?
大家讲道理
大家讲道理 2017-05-19 10:40:19
0
4
554

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();
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(4)
阿神

Ce i équivaut en fait à être déclaré dans initloop.

function initloop() {
    var i = 0;
    function doLoop(x) {
        i = 3;
        console.log(x);
    }
    for ( ; i < 10; i++) {
        doLoop(i + 1);
    }
    
}

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 :

  1. La première fois dans la boucle for, i===0, exécute doLoop(1), donc à l'intérieur de la fonction doLoop, le paramètre formelx===1, alors la valeur de i externe est modifiée et réinitialisée à 3, donc à ce moment i===3, suivi de La valeur de x est imprimée, qui est 1.i===0, 执行doLoop(1), 因此doLoop函数内部, 形参x===1, 接着又改变了外部i的值, 重置为3, 故此时i===3, 紧接着打印出了x的值, 即1.

  2. for循环第二次时, 由于第一次循环结束时i===3, 发生自增操作, 即i++. 故i最终等于4. 4+1=5, 故执行doLoop(5),本次打印出了5. 函数内部重复上一次的操作, 外部i变量再次被重置为3,本次循环结束后i===5.

  3. for循环第三次时, 重复上次操作, i再次被重置为3, 再次打印5, 以此类推, 最终外层的for循环失效, 每次i的值都被重置为3

Lorsque la boucle for boucle pour la deuxième fois, car à la fin de la première boucle i===3, une opération d'incrémentation se produit, c'est-à-dire i++. Par conséquent, i est finalement égal à 4 4+1=5, donc doLoop(5) est exécuté et 5<.> 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

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal