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

Възможен дубликат:
Какво правят празните скоби () след декларация на функция в 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 имат достъп само до свойствата, които декларирате във вашия оператор за връщане, но не и вътрешните неща, които декларирате във вашия 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