@EarthFM

Как решить это задачу?

Почему при вызове makeArmy(), в shooters попадает функция где i не чему не присвоено.

var shooters = [
function() { alert( i ); },
function() { alert( i ); },
];

function makeArmy() {

  var shooters = [];

  for (var i = 0; i < 10; i++) {
    var shooter = function() { // функция-стрелок
      alert( i ); // выводит свой номер
    };
    shooters.push(shooter);
  }

  return shooters;
}

var army = makeArmy();

army[0](); // стрелок выводит 10, а должен 0
army[5](); // стрелок выводит 10...
// .. все стрелки выводят 10 вместо 0,1,2...9
  • Вопрос задан
  • 397 просмотров
Решения вопроса 2
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
Это происходит из-за всплытия переменных. Переменная i объявляется не в блоке цикла, а снаружи его. Таким образом, когда ты вызываешь любую функцию, i у тебя уже дошло до своего финального значения. Решение предложил sanex3339.

Однако, если используешь ES6, то есть более элегантное решение:
function makeArmy() {
  var shooters = [];

  for (let i = 0; i < 10; i++) {
    let shooter = function() { // функция-стрелок
      alert( i ); // выводит свой номер
    };
    shooters.push(shooter);
  }

  return shooters;
}

var army = makeArmy();

army[0](); // 0
army[5](); // 5
Ответ написан
Комментировать
@sanex3339
function makeArmy() {

  var shooters = [];

  for (var i = 0; i < 10; i++) {
    var shooter = function (i) {
        return function () {
            alert(i)
        }
    }(i);
    shooters.push(shooter);
  };

  return shooters;
}

var army = makeArmy();

army[0](); // 0
army[5](); // 5
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SvDenys
@SvDenys
Интересуюсь веб-разработкой
Есть же решение этой задачи на learn.javascript.ru.
Вы ведь оттуда взяли условие, да?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы