Что увидит таймер после изменения переменной в Promise?

Вывод: sync 1, promise 2, timer 2. Таймер замыкает изменяемую переменную, а не автоматически сохраняет её значение 1 в момент регистрации.

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

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

Вывод: sync 1, promise 2, timer 2. Таймер замыкает изменяемую переменную, а не автоматически сохраняет её значение 1 в момент регистрации.

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

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

Условие

В браузере выполните:

let value = 1;
setTimeout(() => console.log('timer', value), 0);
Promise.resolve().then(() => { value = 2; console.log('promise', value); });
console.log('sync', value);

Callback таймера читает переменную при исполнении. Каков вывод?

Ответ

Вывод: sync 1, promise 2, timer 2. Таймер замыкает изменяемую переменную, а не автоматически сохраняет её значение 1 в момент регистрации.

Синхронное чтение происходит до изменения. Реакция Promise меняет value до обработки таймера, поэтому таймер видит 2. Если нужен снимок, его сохраняют в отдельную константу перед регистрацией callback. Само откладывание функции не копирует все доступные ей переменные и объекты.

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

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

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

Подробнее