Что выведет код Senior Области видимости и замыкания обновлено

Замыкание в while с постдекрементом

Вопрос

Что выведет код? По строке на каждый вывод.

var array = [];
var i = 10;

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

console.log(array.length);
console.log(array[0]());
console.log(array[1]());

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 10, -2, -2. Почему так Задача с первого собеседования: ожидалось [20, 18], а получается другое. while (i--) останавливается, когда i становится нулём, но постдекремент уменьшает его ещё раз - к моменту вызова все функции видят −1.

Что выведет

10
-2
-2

Разбор

Почему так

Задача с первого собеседования: ожидалось [20, 18], а получается другое. while (i--) останавливается, когда i становится нулём, но постдекремент уменьшает его ещё раз - к моменту вызова все функции видят −1. Плюс все они замкнуты на одну переменную из-за var. Починка: либо захватить значение параметром немедленно вызываемой функции, либо объявить копию через let внутри тела цикла.

Вывод

10
-2
-2

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.