Javascript est monofilaire, c'est-à-dire qu'il n'exécute qu'une seule instruction à la fois, de manière séquentielle.
Le système d'événements, comme dans de nombreux autres langages et bibliothèques, est géré par une boucle d'événements. La boucle d'événement est essentiellement une boucle qui, à chaque itération, vérifie les messages dans la file d'attente et distribue les événements.
En javascript (comme dans la plupart des langages mettant en œuvre ce modèle), la boucle d'événement est appelée lorsque la pile est vide, c'est-à-dire lorsque toutes les fonctions ont un retour, en d'autres termes, à la fin du code du programme.
Votre "vrai" programme ressemble à quelque chose comme ça derrière la scène :
var run = true, i = 0;
setTimeout(function(){ run = false; }, 1);
while(run){ i++; }
while(true) {
/*
* check for new messages in the queue and dispatch
* events if there are some
*/
processEvents();
}
Ainsi, le message de l'horloge indiquant que le délai d'attente est terminé n'est jamais traité.
Plus d'informations sur la boucle de l'événement sur : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
Bien sûr, c'est un peu plus complexe, vérifiez ici ces exemples : Le javascript est-il garanti comme étant monofilaire ? ( tl;dr : Dans certains moteurs de navigateur, certains événements externes ne dépendent pas de la boucle d'événements et sont immédiatement déclenchés lorsqu'ils se produisent, préemptant la tâche en cours. Mais ce n'est pas le cas de setTimeout, qui se contente d'ajouter un message à la file d'attente et ne se déclenche jamais immédiatement).