Что покажет консоль после выполнения кода?

Будет десять сообщений со значением −1. let здесь объявлена снаружи while, поэтому все callbacks обращаются к одной общей переменной.

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

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

Будет десять сообщений со значением −1. let здесь объявлена снаружи while, поэтому все callbacks обращаются к одной общей переменной.

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

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

Условие

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

let counter = 10;

while (counter--) {
  setTimeout(() => {
    console.log(counter);
  });
}

Ответ

Будет десять сообщений со значением −1. let здесь объявлена снаружи while, поэтому все callbacks обращаются к одной общей переменной.

На последней успешной итерации counter уменьшается с 1 до 0. Затем условие while(counter--) ещё раз проверяет старый 0, завершая цикл, и одновременно уменьшает переменную до -1.

Таймеры выполняются только после завершения синхронного цикла и видят это финальное значение. Сам по себе let не создаёт отдельной переменной для каждой итерации while; для снимка объявите const value = counter внутри тела и замкните его.

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

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

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

Подробнее