Начало вывода: 1, 4, 6, 'foo2', 3, 2, 5, 'foo2'. Затем 'foo2' продолжит появляться из самопланирующегося таймера, пока выполнение не остановят.
Определение порядка вывода в консоль (пример 65)
Начало вывода: 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 таймера и очищать его либо проверять флаг остановки. Нулевая задержка не гарантирует частоту повторов.