Поведение замыкания в цикле при использовании var

Будет выведен объект с 0: 0 и 1: 0. Все функции используют общую i, которая после последней проверки while(i--) становится равной -1.

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

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

Будет выведен объект с 0: 0 и 1: 0. Все функции используют общую i, которая после последней проверки while(i--) становится равной -1.

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

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

Условие

Определите, какой вывод получим после выполнения следующего кода, учитывая особенности замыкания и область видимости переменной, объявленной через var.

var i = 10;
var array = [];

while (i--) {
  array.push(function () {
    return i + 1;
  });
}

console.log({
  0: array[0](),
  1: array[1]()
});

Ответ

Будет выведен объект с 0: 0 и 1: 0. Все функции используют общую i, которая после последней проверки while(i--) становится равной -1.

Проверка с i=0 возвращает falsy и заканчивает цикл, но постдекремент всё равно уменьшает i. Позднее каждая функция вычисляет -1 + 1. Отдельная копия значения на итерацию здесь не создаётся, поскольку используется одна var-привязка.

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

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

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

Подробнее