Вывод: sync 1, promise 2, timer 2. Таймер замыкает изменяемую переменную, а не автоматически сохраняет её значение 1 в момент регистрации.
Что увидит таймер после изменения переменной в Promise?
Вывод: 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. Само откладывание функции не копирует все доступные ей переменные и объекты.