该函数如何创建对象

时间:2013-01-07 16:52:34

标签: javascript function design-patterns object

  

可能重复:
  What do empty parentheses () after a function declaration do in 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

这是什么样的模式?

3 个答案:

答案 0 :(得分:2)

这是常见的module pattern

这个

  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函数。

答案 1 :(得分:1)

(function() {
})();

被称为IIFE立即调用的函数表达式。基本上它是一个在没有明确调用它的情况下立即执行的函数。包含该函数的括号将声明转换为表达式,结尾处的空()是移交给IIFE的参数。

$a被赋予IIFE的returnvalue,它是一个带有一个名为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中声明的内部内容。

答案 2 :(得分:0)

额外括号表示立即调用此函数。这意味着内部的所有内容都被执行,该函数的返回值将是$ a的值。

在您的示例中,$ a现在包含一个对象{init:init}

如果省略额外的括号,你应该声明一个你可以打电话的新功能。

阅读有关立即调用的函数表达式here

的更多信息