Проверяет понимание того, как setTimeout взаимодействует с Event Loop и почему он не блокирует выполнение синхронного кода.
setTimeout — это асинхронная функция, которая не блокирует Event Loop. Когда вы вызываете setTimeout, движок JavaScript передаёт задачу окружению (браузеру или Node.js), которое запускает таймер. Сам колбэк не выполняется сразу — он помещается в очередь задач (task queue) только после истечения указанной задержки и освобождения стека вызовов.
Event Loop — это механизм, который постоянно проверяет, пуст ли стек вызовов, и если да, забирает задачи из очереди. Пока синхронный код выполняется, Event Loop ждёт. setTimeout просто добавляет задачу в очередь на будущее, не останавливая цикл.
console.log('start');
setTimeout(() => console.log('timeout'), 0);
console.log('end');
// Вывод: start, end, timeoutДаже с задержкой 0 колбэк выполнится после всего синхронного кода, потому что он попадает в очередь задач, а не в стек.
// Это заблокирует Event Loop на несколько секунд
while (Date.now() - start < 5000) {}
setTimeout(() => console.log('never on time'), 0);В примере выше setTimeout не выполнится, пока цикл не завершится, потому что стек занят.
Итог: setTimeout — инструмент отложенного выполнения, он не блокирует Event Loop. Блокировку вызывают только синхронные тяжёлые операции, которые стоит выносить в Web Workers или разбивать на части.