Исходник не исполняется из-за синтаксиса const foo1 = {} =>. После исправления на () => возникает бесконечная цепочка микрозадач, которая не даёт таймерам выполнить 2 и 5.
Определение последовательности вывода в консоль №64
Исходник не исполняется из-за синтаксиса 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 ставит следующий в очередь микрозадач; очередь не опустошается, поэтому обычные задачи таймеров и обновление интерфейса могут голодать. Это не синхронная рекурсия с обычным переполнением стека, но всё равно зависание и рост затрат. Для исправления нужно ограничить число повторений или уступать управление через задачи; запускать бесконечный пример для проверки не стоит.