Как эта функция создает объект

Возможный дубликат:
Что делают пустые скобки () после объявления функции в javascript?

Я в основном понимаю, как работает Javascript. Теперь я самостоятельно изучаю шаблоны проектирования Javascript, просматривая работы других программистов, и я натыкаюсь на это

  var $a = (function() {
    var a..... //assigning values & functions to variables 
    return { init : init }; //in the variable above there is "init" 
  })();
  $a.init();

Я могу сказать, что $a.init() создает объект со свойствами и функциями, перечисленными выше. Но я не понимаю, как это на самом деле работает.

Почему функция написана именно так(function() { })() ?

Зачем нужна return {init: init}, когда выше уже есть функция init?

Что это за узор?


person Community    schedule 07.01.2013    source источник
comment
Оператор return создает объект с одним свойством, init, значение которого (по-видимому) является ссылкой на локальную функцию, называемую init.   -  person Pointy    schedule 07.01.2013
comment
@Pointy, так что return{init:init} просто создайте функцию init в $a, когда вызывается $a, а затем $a.init() выполняет остальные задания?   -  person    schedule 07.01.2013
comment
да. Нотация { property: value, property: value, ... } называется литеральным выражением объекта, и она создает объект. Таким образом, оператор return возвращает этот сконструированный объект.   -  person Pointy    schedule 07.01.2013
comment
@Pointy, спасибо, теперь я понял всю картину :)   -  person    schedule 07.01.2013


Ответы (3)


(function() {
})();

Называется выражением IIFE немедленно вызываемой функции. По сути, это функция, которая выполняется немедленно, без явного вызова. Скобки, окружающие функцию, превращают объявление в выражение, а пустые () в конце — это параметры, переданные в IIFE.

$a присваивается возвращаемое значение вашего IIFE, который является объектом с методом, называемым init, который вызывает функцию внутри вашего IIFE, которая также называется init.

return { init : init };
                 /\ the name of the method which is called internally
          /\ the name of the method which is returned from the function

Это распространенный способ модульного разделения вашего Javascript и создания своего рода конфиденциальности (что не так уж тривиально, потому что javascript по умолчанию не имеет конфиденциальности, как другие языки).
Таким образом, другие части javascript имеют доступ только к свойства, которые вы объявляете в своем операторе return, но не внутренние вещи, которые вы объявляете в своем IIFE.

person Christoph    schedule 07.01.2013

Это распространенный шаблон модуля.

Этот

  var $a = (function() {
     var a..... //assigning values & functions to variables 
     var init = function() {... uses a};
     return { init : init }; //in the variable above there is "init" 
  })();
  $a.init();

это примерно как делать

var a..... //assigning values & functions to variables 
var $a = { init : function(){... uses a} }; //in the variable above there is "init" 
$a.init();

но с тем преимуществом, что a является закрытым (вы не можете читать или писать его, если нет функции, предоставляющей к нему доступ) и не загромождает глобальное пространство имен. По той же причине локально объявленная функция init должна быть объявлена ​​в возвращаемом объекте.

person Denys Séguret    schedule 07.01.2013

лишние скобки означают, что эта функция вызывается немедленно. что означает, что все внутри выполняется, и возвращаемое значение этой функции будет значением $a.

в вашем примере $a теперь содержит объект {init: init}

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

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

person hereandnow78    schedule 07.01.2013