Определение порядка вывода в консоль (пример 65)

Начало вывода: 1, 4, 6, 'foo2', 3, 2, 5, 'foo2'. Затем 'foo2' продолжит появляться из самопланирующегося таймера, пока выполнение не остановят.

Короткий ответ

Что ответить на собеседовании

Начало вывода: 1, 4, 6, 'foo2', 3, 2, 5, 'foo2'. Затем 'foo2' продолжит появляться из самопланирующегося таймера, пока выполнение не остановят.

Подробный разбор

Ответ с пояснениями

Условие

В какой последовательности будут отображены сообщения в консоли?

console.log(1);

setTimeout(function() {
    console.log(2);
});

Promise.resolve(3).then(console.log);

console.log(4);

setTimeout(function() {
    console.log(5);
}, 0);

console.log(6);

const repeatLog = () => {
    console.log('foo2');
    setTimeout(repeatLog);
}

repeatLog();

Ответ

Начало вывода: 1, 4, 6, 'foo2', 3, 2, 5, 'foo2'. Затем 'foo2' продолжит появляться из самопланирующегося таймера, пока выполнение не остановят.

Первый вызов repeatLog синхронный и печатает foo2 до микрозадачи Promise. После завершения текущего кода выполняется then с числом 3. Далее идут зарегистрированные таймеры: 2, 5 и первый повтор repeatLog. Последний каждый раз ставит новый таймер; это не синхронная бесконечная рекурсия и не наращивание стека. Для остановки нужно хранить ID таймера и очищать его либо проверять флаг остановки. Нулевая задержка не гарантирует частоту повторов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее