Таймеры с общим массивом: вывод после раскомментирования

В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].

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

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

В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].

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

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

Условие

Определите, какой результат будет напечатан в консоли.

for (var arr = []; arr.length < 3; arr.push(1)) {
  setTimeout(function () {
    // console.log(arr);
  }, 1000);
}

Ответ

В показанном коде вывода нет, потому что console.log закомментирован. Если его раскомментировать, каждый из трёх таймеров покажет массив [1, 1, 1].

Цикл выполняется синхронно и три раза регистрирует callback. После каждой итерации arr.push(1) увеличивает длину, пока она не станет равной 3.

Все callbacks обращаются к одной переменной arr и одному массиву, а не к снимку его содержимого при регистрации. К моменту таймеров массив уже заполнен. Для сохранения промежуточного состояния пришлось бы создать отдельную копию внутри каждой итерации.

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

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

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

Подробнее