//Mise à jour : Cette question n'a pas de valeur de référence et est un peu déroutante. Elle a été fermée. Pour plus de détails, veuillez consulter ma réponse ci-dessous
J'ai vu un blog mentionné il y a deux jours : Si le temps d'exécution de la fonction de rappel setInterval est supérieur au délai spécifié, lorsque le timer est déclenché, si la file d'attente des tâches a une fonction de rappel pour le même timer, alors ce rappel sera Ignoré, ce qui signifie qu'il n'y aura pas deux ou plusieurs fonctions de rappel du même minuteur dans la file d'attente des tâches. L'énoncé n'est pas clair, il suffit de regarder le code :
(function(){
var j=1;
var start=new Date().getTime();
var timr=setInterval(function(){
console.log("第"+j+"次定时器开始时间:"+(new Date().getTime()-start));
for(var i=0;i<5000;i++){console.log("")};
console.log("第"+j+"次定时器结束时间:"+(new Date().getTime()-start));
j++;
},100);
setTimeout(function(){
clearInterval(timr)
},1000)
})()
setInterval ajoute une fonction à la file d'attente des tâches toutes les 100 ms et setInterval est effacé après 1000 ms. Expliquez ce résultat selon l'énoncé ci-dessus :
Mettez la première boucle for dans la file d'attente des tâches à 100 ms, et le thread principal inactif commence à exécuter cette boucle, ce qui prend 863 ms ;
Lorsque le minuteur (numéro de séquence théorique) est déclenché de la troisième à la huitième fois, le thread principal exécute la première boucle for, et il y a une seconde boucle for dans la file d'attente des tâches, donc ces fonctions sont ignorées et la tâche n'est pas entré dans la file d'attente ;
À 1000 ms, le dixième timer est déclenché, mais est ignoré pour la même raison que le troisième, puis setInterval est effacé.
Exemple 2
for(var i=0;i<10000;i++){
console.log(1)
}
setInterval(function(){
console.log("定时器")
},1000)
Le navigateur exécute d'abord la boucle for, ce qui a pris environ 13 secondes sur mon ordinateur (l'ordinateur est tellement mauvais... D'après la déclaration ci-dessus, pendant ces 13 secondes, il n'y aura qu'une seule fonction de ce timer dans le fichier). file d'attente des tâches. Ensuite, le résultat de l'exécution est d'imprimer 13 "minuteries" en même temps après 13 secondes, puis d'exécuter la fonction dans une période d'une seconde.
J'ai posé cette question, mais maintenant je me sens un peu confuse. . .
Dans le deuxième exemple, le thread js a été occupé lors de l'exécution de la boucle for et l'instruction suivante n'a pas été analysée, c'est-à-dire que le timer n'a pas été enregistré. Modifiez l'exemple et ajoutez le temps d'exécution :
Ce sera très clair lorsque vous utiliserez cet exemple pour tester. La boucle for ci-dessus s'est exécutée pendant environ 1544 ms. À ce moment-là, le thread js a analysé l'instruction, le minuteur a été enregistré, puis exécuté normalement.
Il n'y a donc pas de conflit entre les deux exemples. Le premier exemple est correct. Lorsque le thread principal exécute la fonction timer et que la file d'attente des tâches a la même fonction timer, pendant cette période, le timer Tous les déclencheurs sont ignorés. .
Cependant, L'exemple 2 pour setInterval n'a pas été exécuté avant la fin