Задать вопрос
@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
  • Вопрос задан
  • 400 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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.
Вы ведь оттуда взяли условие, да?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы