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

Veuillez regarder ces quatre fonctions setTimeout et leurs parties d'exécution

//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 ?

P粉304704653P粉304704653398 Il y a quelques jours556

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

  • P粉709307865

    P粉7093078652023-09-18 13:33:27

    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 :

    第三个setTimeout(0毫秒延迟)
    第二个setTimeout(3000毫秒延迟)
    第一个setTimeout(5000毫秒延迟)
    第四个setTimeout(7000毫秒延迟)

    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 :

    1. bye
    2. hello
    3. hi
    4. 从10000打印到0(降序)
    5. 代码执行时间为...毫秒

    répondre
    0
  • Annulerrépondre