Будет выведен объект с 0: 0 и 1: 0. Все функции используют общую i, которая после последней проверки while(i--) становится равной -1.
Поведение замыкания в цикле при использовании var
Будет выведен объект с 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-привязка.