Оба вызова выведут 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 недостаточно.