//1 setTimeout(() => { console.log('hi'); }, 5000) //2 setTimeout(() => { console.log('hello'); }, 3000) //3 setTimeout(() => { console.log('bye'); }, 0) //4 setTimeout(() => { console.time('the code took:'); let i = 10000 while (i--) { console.log(i); } console.timeEnd('the code took:') }, 7000)
Ici, j'ai écrit quatre fonctions setTimeout D'après ma compréhension, elles commenceront à s'exécuter en même temps dans la file d'attente de rappel, n'est-ce pas ? Si j'ai raison, ma question est de savoir si la quatrième fonction setTimeout() a terminé la moitié ou plus de la moitié de son exécution dans la file d'attente de rappel ou démarre-t-elle depuis le début après 7 secondes après avoir été insérée dans l'implémentation de la pile d'appels ? Alors que se passe-t-il dans les coulisses ?
Ces fonctions ne s'exécuteront pas en parallèle ou simultanément dans la file d'attente de rappel. Ils sont programmés individuellement et de manière asynchrone. L'ordre d'exécution dépend de la latence spécifiée de chaque fonction. Pour chaque fonction setTimeout, un rappel est programmé pour s'exécuter après le délai spécifié.
La séquence d'exécution est la suivante :
Cependant, la quatrième fonction setTimeout ne s'exécute pas nécessairement avec d'autres fonctions setTimeout, et son exécution n'est pas non plus garantie seule. L'ordre d'exécution est déterminé par la file d'attente de rappel, la boucle d'événements récupère les tâches de la file d'attente de rappel et les exécute dans la pile d'appels uniquement lorsque la pile d'appels est vide. Par conséquent, la quatrième fonction setTimeout ne commencera à s'exécuter que lorsqu'il n'y aura aucune autre tâche dans la pile d'appels. Après avoir exécuté le code donné, le résultat devrait apparaître dans l'ordre suivant :
Voici la séquence de sortie :