Создание массива функций с замыканием и выводом индексов

Оба вызова выведут 10. Переменная i объявлена один раз перед while, и все функции замыкают это общее связывание, а не число текущей итерации.

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

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

Оба вызова выведут 10. Переменная i объявлена один раз перед while, и все функции замыкают это общее связывание, а не число текущей итерации.

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

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

Условие

В функции assemblePages формируется массив, заполняемый функциями, которые выводят текущий номер страницы. При каждом проходе цикла создаётся новая функция, сохраняющая значение счётчика. После завершения цикла массив возвращается, и отдельные функции можно вызвать для вывода нужных номеров.

function assemblePages() {
    let pages = [];
    let i = 0;
    while (i < 10) {
        const printPage = function () {
            console.log(i);
        };
        pages.push(printPage);
        i++;
    }
    return pages;
}

let bookReader = assemblePages();

bookReader[0]();
bookReader[5]();

В данном примере демонстрируется, как замыкание сохраняет ссылку на переменную счётчика, поэтому при вызове функций после завершения цикла будет выведено последнее значение счётчика, а не значение на момент создания функции. Это типичный кейс для обсуждения поведения замыканий в JavaScript.

Ответ

Оба вызова выведут 10. Переменная i объявлена один раз перед while, и все функции замыкают это общее связывание, а не число текущей итерации.

Чтобы сохранить номер, создайте отдельную переменную внутри каждой итерации:

function assemblePages() {
  const pages = [];
  for (let i = 0; i < 10; i++) {
    pages.push(() => console.log(i));
  }
  return pages;
}

let в заголовке for создаёт отдельное связывание для каждой итерации, поэтому исправленные bookReader0 и bookReader5 выводят 0 и 5. В исходном while одного использования let недостаточно.

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

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

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

Подробнее