Maison > Questions et réponses > le corps du texte
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的不一样?
谢谢各位的回答哈。
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
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
. setTimeout
qu'en tant que paramètre. #🎜🎜#高洛峰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
滿天的星座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
执行的时候j
是0
,所有的setTimeout
都是延迟0
while
est exécuté, j
vaut 0
, et tous les setTimeout
sont des retards 0
Démarrer l'exécution après. 🎜过去多啦不再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)
迷茫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
.