Javascript однопотоковий, це означає, що він виконує лише одну інструкцію одночасно, послідовно.
Система подій, як і в багатьох інших мовах та бібліотеці, обробляється циклом подій. Цикл подій - це, в основному, цикл, який на кожній ітерації перевіряє наявність повідомлення в черзі та відправляє події.
У javascript (як у мові мов, що реалізують цей шаблон), цикл подій викликається, коли стек порожній, тобто, коли всі функції мають повернення, іншими словами, в кінці програмного коду.
Ваша "справжня" програма виглядає за кадром приблизно так:
var run = true, i = 0;
setTimeout(function(){ run = false; }, 1);
while(run){ i++; }
while(true) {
processEvents();
}
Тож повідомлення від годинника про те, що час очікування закінчився, ніколи не обробляється.
Докладніше про цикл подій на:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
Звичайно, це трохи складніше, перегляньте ось ці приклади: Чи гарантовано JavaScript буде однопоточним? ( tl; dr: У деяких механізмах браузера деякі зовнішні події не залежать від циклу подій і негайно запускаються, коли вони відбуваються, випереджаючи поточне завдання. Але це не так у випадку setTimeout, який просто додає повідомлення в чергу і ніколи не стріляє негайно.)