Оба вызова выведут 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++), который создаёт отдельные привязки итераций.