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)
IIFE– ThisMan Jun 07 '19 at 07:59