Как решить это задачу?
Это происходит из-за всплытия переменных. Переменная 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
Есть же решение этой задачи на learn.javascript.ru.
Вы ведь оттуда взяли условие, да?