Определение последовательности вывода в консоль №64

Исходник не исполняется из-за синтаксиса const foo1 = {} =>. После исправления на () => возникает бесконечная цепочка микрозадач, которая не даёт таймерам выполнить 2 и 5.

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

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

Исходник не исполняется из-за синтаксиса const foo1 = {} =>. После исправления на () => возникает бесконечная цепочка микрозадач, которая не даёт таймерам выполнить 2 и 5.

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

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

Условие

Укажите, в каком порядке появятся сообщения в консоли при выполнении следующего JavaScript‑кода:

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 foo1 = {} => {
    console.log('foo1');

    return Promise.resolve().then(foo1);
}

foo1(); 

Ответ

Исходник не исполняется из-за синтаксиса const foo1 = {} =>. После исправления на () => возникает бесконечная цепочка микрозадач, которая не даёт таймерам выполнить 2 и 5.

После исправления синтаксиса синхронно выводятся 1, 4, 6 и foo1. Затем первая микрозадача печатает 3, после чего foo1 многократно выводится из самопродолжающейся цепочки then.

Каждый foo1 ставит следующий в очередь микрозадач; очередь не опустошается, поэтому обычные задачи таймеров и обновление интерфейса могут голодать. Это не синхронная рекурсия с обычным переполнением стека, но всё равно зависание и рост затрат. Для исправления нужно ограничить число повторений или уступать управление через задачи; запускать бесконечный пример для проверки не стоит.

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

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

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

Подробнее