0

可能重复:
在 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

这是什么图案?

4

3 回答 3

2

这是常见的模块模式

  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必须在返回的对象中声明本地声明的函数。

于 2013-01-07T16:56:29.217 回答
1
(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 中声明的内部内容。

于 2013-01-07T16:55:47.257 回答
0

额外的括号意味着立即调用此函数。这意味着里面的所有东西都被执行了,该函数的返回值将是 $a 的值。

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

如果你省略了额外的括号,你应该声明一个你可以调用的新函数。

在此处阅读有关立即调用的函数表达式的更多信息

于 2013-01-07T16:56:45.363 回答