Что покажет консоль при вызове функций из массива

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

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

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

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

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

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

Условие

Определите, какой результат будет выведен в консоль при выполнении следующего JavaScript‑кода.

function makeBook() {
    let book = [];
    let i = 0;
    while (i < 10) {
        const page = function() {
            console.log(i);
        };
        i++;
        book.push(page);
    }
    return book;
}

let reader = makeBook();
reader[0](); // ?
reader[5](); // ?

Ответ

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

Цикл сначала создаёт callback, увеличивает общий i и добавляет callback в массив. К моменту reader0 и reader5 цикл уже завершён при i=10.

const page фиксирует ссылку на очередную функцию, но не копирует i внутри неё. Для разных значений создавайте отдельную const current = i внутри тела цикла и выводите current, либо используйте for (let i=0; i<10; i++), который создаёт отдельные привязки итераций.

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

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

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

Подробнее