javascript - Question piège js : quelle est la raison pour laquelle le résultat de la fonction setTimeout() est de cinq 6 après l'exécution ?
黄舟
黄舟 2017-05-19 10:47:29
0
3
771

Quelle est la raison pour laquelle le résultat de la fonction setTimeout() est cinq 6 ?

 for (var i = 1; i <= 5; i++) {
        setTimeout(function timer() {
            console.log(i);
        }, i * 1000);
    }
// 其实我们想得到的结果是1,2,3,4,5,结果却是五个6

Bien que j'aie résolu le problème en utilisant la fermeture js et obtenu les 1, 2, 3, 4, 5 souhaités, je ne comprends toujours pas pourquoi cinq 6 apparaissent dans le code ci-dessus ?

 for (var i = 1; i <= 5; i++) {
        (function(j) {
            setTimeout(function timer() {
                console.log(j);
            }, j * 1000);
        })(i);
        
//通过一个立即执行函数,为每次循环创建一个单独的作用域
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(3)
PHPzhong

La première chose que vous devez comprendre est que le mécanisme de tâches de JS est le mécanisme de file d'attente.

Ainsi, au lieu d'exécuter une boucle for, nous plaçons simplement la tâche setTimeout à la fin de la file d'attente. Autrement dit, le code exécuté dans setTimeout ne sera exécuté qu'après l'exécution de la boucle for, donc la valeur de i à ce moment-là est. la valeur qui ne satisfait pas la boucle for exécutera le code setTimeout.

Opinion personnelle, veuillez signaler s'il y a quelque chose qui ne va pas

Peter_Zhu

var peut être modifié pour laisser

var est une définition globale, i ne forme pas de fermeture, et log(i) imprime la valeur finale de i 6

let est un domaine de niveau bloc

for (let i = 1; i <= 5; i++) {
        setTimeout(function timer() {
            console.log(i);
        }, i * 1000);
    }
为情所困

setTimeout a deux caractéristiques : son this est séparé du this du contexte, et son appel est asynchrone.

Cela est dû à [asynchrone], la boucle for sera terminée en premier, puis setTimeout sera exécuté, car la boucle for sera 6 à la fin à chaque exécution - donc naturellement setTimeout et puis j'appellerai j'aurai cinq ans 6

Solution 1 :

var 换 let

Solution 2 :

楼主自己用的闭包

Solution trois :

//类似于方法二,使用setTimeout的第三个参数直接传参
  for (var i = 1; i <= 5; i++) {
    setTimeout(function(i) {
      console.log(i);
    }, i * 1000,i);
  }
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!