recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - problème asynchrone js, problème settimeout

var i = 0, timer, j = 0;
while(i++ < 5) {
  timer = window.setTimeout(function(){
    j++;
    alert(j);
  }, 1000);
}
clearTimeout(timer);

La sortie est 1,2,3,4
Pourquoi 5 n'est-il pas sorti ? Et pourquoi le résultat est-il ainsi ? N'attribue-t-il pas des valeurs et ne les écrase-t-il pas à chaque fois ? Pourquoi est-il toujours exécuté ? Quelle est la commande ? Quand l'instruction clearTimeout est-elle exécutée ? Si vous la modifiez légèrement
var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert( j);
}, i*1000);
}
clearTimeout(timer);
Ceci est affiché toutes les secondes. Si le problème ci-dessus est résolu, alors il n'y a rien de mal
Continuez à changer
.

    var i = 0, timer, j = 0;
    while(i++ < 5) {
      timer = window.setTimeout(function(){
        j++;
        alert(j);
      }, j*1000);
    }

clearTimeout(timer);
这个时候,他是同时输出的,为什么跟上面用i的不一样?

















谢谢各位的回答哈。
伊谢尔伦伊谢尔伦2736 Il y a quelques jours653

répondre à tous(5)je répondrai

  • PHPz

    PHPz2017-05-19 10:35:22

    Tout d'abord, 5 timers sont créés dans le corps de la boucle. Chaque timer a son propre ID. L'ID est renvoyé lors de l'appel de setTimeout et est une valeur numérique.
    Deuxièmement, timer enregistre uniquement l'ID du timer et ne modifie pas l'ID du timer, donc lorsque la boucle se termine, timer enregistre uniquement le dernier ID du timer. Il doit être clair ce que couvre la mission.
    La fonction du minuteur commence à s'exécuter après l'exécution de clearTimeout. Ainsi, le dernier minuteur est effacé. Les autres timers sont exécutés comme d'habitude. setTimeout时被返回,是一个数值。
    其次,timer只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。
    定时器里的函数是在clearTimeout执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。

    最后那个,while执行的时候setTimeout里的函数并没有被调用,因此j++并没有执行,所以在循环体内j一直是0
    注:匿名函数只是作为一个参数被传入setTimeout

    Le dernier, lorsque while est exécuté, la fonction dans setTimeout n'est pas appelée, donc j++ n'est pas exécutée, donc dans la boucle j dans le corps est toujours 0.
    Remarque : La fonction anonyme n'est transmise à la fonction setTimeout qu'en tant que paramètre. #🎜🎜#

    répondre
    0
  • 高洛峰

    高洛峰2017-05-19 10:35:22

    Première question, lorsque i=4, il devrait avoir alert(j==5) après 1 seconde, mais clearTimeout(timer) a été exécuté immédiatement pour annuler alert(j)

    La deuxième question est la même que ci-dessus

    La troisième question, lorsque i=0, j vaut 0, vous pouvez penser que l'opération d'alerte sera exécutée directement, mais ce n'est pas le cas. setTimeout(code, millisec) met le code dans une file d'attente puis l'exécute. plus tard, donc quand i=1, j est toujours 0. De même, i=2,3,4,5, donc 1234 sera affiché en continu

    répondre
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:22

    Parce que tous les setTimeout sont exécutés après clearTimeout(timer), le cinquième a été effacé. setTimeout是在clearTimeout(timer)之后才开始执行的,已经把第五个清除掉了。

    最后那个是因为while执行的时候j0,所有的setTimeout都是延迟0

    Le dernier est parce que lorsque while est exécuté, j vaut 0, et tous les setTimeout sont des retards 0Démarrer l'exécution après. 🎜

    répondre
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:35:22

    Regardez bien ceci while(i++ < 5) pourquoi il ne peut pas afficher 5 car il n'est pas supérieur à 5. Solution while(i++ <= 5)

    répondre
    0
  • 迷茫

    迷茫2017-05-19 10:35:22

    Répondons à la première, car setTimeout est exécuté de manière asynchrone, donc clearTimeout(timer) effacera la première minuterie. C'est-à-dire que lorsque i=0, l'alerte ne sortira pas, j n'a pas exécuté j++, et j est toujours égal à 0. Après une seconde, le minuteur est à nouveau généré. À ce moment-là, i=1,j=0 Puisque le clearTimeout(timer) suivant est exécuté de manière synchrone, le minuteur n'est plus effacé, vous pouvez donc voir vos résultats actuels

    .

    répondre
    0
  • Annulerrépondre