Возврат самовыполняющейся анонимной функции

получил эту функцию:

function Something(name){
   this.name = name;
}

var createSomething = (function() {
  function F(args) {
    return Something.apply(this, args);
  }
  F.prototype = Something.prototype;

  return function() {
    return new F(arguments);
  }
})();

var x = createSomething('abc');

Почему createSomething должна быть самовызываемой функцией?

Я заметил, что при выходе из вызывающих скобок () x будет просто пустым. Но почему?

Он вызывается «без запроса» при инициализации javascript, а затем снова запускается после «запроса». Но в чем смысл первого запуска? Правильно ли он назначает «это» или в чем смысл использования?


person DavidCockerfield    schedule 14.09.2014    source источник
comment
createSomething — это function(){return new F(arguments)}   -  person slebetman    schedule 14.09.2014


Ответы (1)


Почему createSomething должна быть самовызываемой функцией?

createSomething не является самовызывающейся функцией, но хранит результат самовызывающейся функции. Самовызывающиеся функции также известны как IIFE в мире javascript. Я предлагаю вам прочитать это, чтобы лучше понять.

Я заметил, что при выходе из вызывающих скобок () x будет просто пустым. Но почему?

Он не будет пустым, а будет указывать на безымянный функциональный объект. возможно, вы имели в виду, что это не даст ожидаемого результата.

Он вызывается «без запроса» при инициализации javascript, а затем снова запускается после «запроса». Но в чем смысл первого запуска? Правильно ли он назначает «это» или в чем смысл использования?

При первом запуске безымянная функция создает новую функцию (которая затем назначается createSomething). Эта вновь созданная функция (на которую ссылается createSomething) затем вызывается с помощью 'abc', второго запуска IIFE не происходит.

Следует также отметить, что function F доступен только для вновь созданной функции. Базовый механизм для этого называется замыканиями. Я бы посоветовал вам понять эти основные концепции (связанные в этом ответе), чтобы получить лучшее представление.

person Prabhu Murthy    schedule 14.09.2014
comment
Я понимаю. Спасибо. Я уже читал о шаблоне модуля, однако всякий раз, когда кто-то заявляет, что он создан в шаблоне модуля, чтобы не загрязнять глобальное пространство имен, это звучит немного странно. так как, если он определен внутри функции, независимо от того, является ли он модулем или нет, он все равно не будет загрязнять пространство имен, за исключением того, что он определен выше контекста и не определен в новой функции/модуле. Или я что-то там не так уловил? - person DavidCockerfield; 14.09.2014