Это происходит из-за всплытия переменных. Переменная 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