Sobes.tech
Назад к вопросам
Middle+
1

Как сделать так, чтобы функция makeBook возвращала ожидаемые значения 0 и 5 вместо двух десяток?

Компании, где спрашивали
SelectySelecty

Ответ от нейросети

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, нужно правильно замыкать переменную цикла.