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的不一样?
谢谢各位的回答哈。
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
执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。最后那个,
Le dernier, lorsquewhile
执行的时候setTimeout
里的函数并没有被调用,因此j++
并没有执行,所以在循环体内j
一直是0
。注:匿名函数只是作为一个参数被传入
setTimeout
while
est exécuté, la fonction danssetTimeout
n'est pas appelée, doncj++
n'est pas exécutée, donc dans la bouclej
dans le corps est toujours0
.Remarque : La fonction anonyme n'est transmise à la fonction
setTimeout
qu'en tant que paramètre. #🎜🎜#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
Parce que tous les
setTimeout
sont exécutés aprèsclearTimeout(timer)
, le cinquième a été effacé.setTimeout
是在clearTimeout(timer)
之后才开始执行的,已经把第五个清除掉了。最后那个是因为
Le dernier est parce que lorsquewhile
执行的时候j
是0
,所有的setTimeout
都是延迟0
while
est exécuté,j
vaut0
, et tous lessetTimeout
sont des retards0
Démarrer l'exécution après. 🎜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é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
.