Назад к вопросам
Selecty
Middle+
1
Как сделать так, чтобы функция makeBook возвращала ожидаемые значения 0 и 5 вместо двух десяток?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Проблема с функцией makeBook, возвращающей два раза по 10 вместо 0 и 5, скорее всего связана с тем, что переменные, используемые для формирования результата, захватываются в замыкание или изменяются в цикле.
Пример на JavaScript, где ошибка часто возникает:
function makeBook() {
let result = [];
for (var i = 0; i < 2; i++) {
result.push(function() { return i * 5; });
}
return result.map(f => f());
}
console.log(makeBook()); // [10, 10]
Здесь var i — одна и та же переменная, и к моменту вызова функций i равно 2, поэтому 2*5=10.
Чтобы исправить, нужно использовать let для создания новой переменной в каждой итерации:
function makeBook() {
let result = [];
for (let i = 0; i < 2; i++) {
result.push(function() { return i * 5; });
}
return result.map(f => f());
}
console.log(makeBook()); // [0, 5]
Или использовать замыкание:
function makeBook() {
let result = [];
for (var i = 0; i < 2; i++) {
(function(j) {
result.push(function() { return j * 5; });
})(i);
}
return result.map(f => f());
}
console.log(makeBook()); // [0, 5]
Таким образом, чтобы функция возвращала ожидаемые значения 0 и 5, нужно правильно замыкать переменную цикла.