Что выведет этот код?
for (var i = 0; i < 4; i++) {
setTimeout(() => console.log(i), 0)
}Ответ:
На экране будут четыре четвёрки.
Здесь классическая ловушка с нулевыми задержками. Дело в том, что setTimeout (callback, 0) не означает, что обратный вызов функции сработает через ноль миллисекунд.
Вот что происходит тут на самом деле:
Текущий стек вызовов установлен на первый setTimeout ().
windows.setTimeout () — это веб-API, и он не блокирует ввод-вывод при работе с функциями. Это значит, что через 0 миллисекунд наша анонимная функция будет отправлена в очередь, а не в стек вызовов. А в очереди она подождёт, пока основная программа не закончит свои дела и не вернётся к очереди.
Поскольку стек вызовов свободен, цикл for может продолжиться до второго setTimeout (), потом до третьего и до четвёртого.
Теперь цикл завершён, и i равно 4. Теперь JS может выполнять очередь вызовов один за другим. В итоге каждый console.log (i) выведет 4.
#js #собеседование