Последняя задача отсюда: https://learn.javascript.ru/closures-usage. Комментарии автора к решению совершенно меня запутали. Может кто-нибудь здесь поможет разложить в моей голове все по полочкам?
function makeArmy() {
var shooters = [];
for (var i = 0; i < 10; i++) {
var shooter = function(x) {
return function() {
console.log( x );
};
}(i);
shooters.push(shooter);
}
return shooters;
}
var army = makeArmy();
army[0]();
army[5]();
Непонятен конкретно этот момент:
var shooter = function(x) {
return function() {
console.log( x );
};
}(i);
Какую функцию вызывает вот это (i) и откуда x передается аргументом ?
var shooter = function(x) {
return function() {
console.log( x );
};
}(i);
Код, который вас смутил, это IIFE.
По русски - Немедленно выполняемое функциональное выражение
Можно еще встретить такой вариант ( разницы нет ):
var shooter = (function(x) {
return function() {
console.log( x );
};
})(i);
Работает это так: в переменную shooter запишется не сама функция, а ее результат, потому что мы после определения функции ее сразу же вызываем. Пример ваш можно переписать вот так
function foo(x) {
return function() {
console.log( x );
};
}
const i = 10;
const shooter = foo(i);
Но, в примере с IIFE мы не загрязняем область видимости всякими foo, просто берем функцию, выполняем ее и забываем. Это полезно для создания замыканий, как например, в данном случае.
и откуда x передается аргументом
x аргумент берется как раз из последующего вызова (i)
Продвижение своими сайтами как стратегия роста и независимости