1

Последняя задача отсюда: 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();

army0; army5;

Непонятен конкретно этот момент:

  var shooter = function(x) {

    return function() {
      console.log( x );
    };

  }(i);

Какую функцию вызывает вот это (i) и откуда x передается аргументом ?

ThisMan
  • 12,261
Lyy
  • 311
  • Постарайтесь, пожалуйста, дать вопросу нормальное название – Kromster Jun 07 '19 at 07:57
  • @Kromster Я сильно старался, но ничего не придумал – Lyy Jun 07 '19 at 07:58
  • то что вас запутало называется IIFE – ThisMan Jun 07 '19 at 07:59
  • 1
    Постарайтесь, пожалуйста, еще немного сильнее. В текущем виде это желтизна и привлекает поставить ей минус. – Kromster Jun 07 '19 at 08:00
  • Я попробовал поменять название)) Звучит не так броско, но суть вопроса, вроде как отражает ( да и для поиска очень хорошее название ) – ThisMan Jun 07 '19 at 08:02

1 Answers1

2
  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)

ThisMan
  • 12,261
  • а почему вы думаете, что смутило автора IIFE, а не сам возврат функции в принципе? может ему вообще конструкция return function() не понятна. – teran Jun 07 '19 at 08:13
  • @teran последующие вопрос про аргумент на это намекает – ThisMan Jun 07 '19 at 08:14
  • @teran ну и что ответ приняли:D – ThisMan Jun 07 '19 at 08:14
  • 1
    @ThisMan Спасибо вам огромное, после примера с foo стало все понятно. – Lyy Jun 07 '19 at 08:20
  • @ThisMan а да, пока комменты читал, забыл чем вопрос закончился :D – teran Jun 07 '19 at 08:56