可能重复:
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
?
这是什么样的模式?
答案 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
的更多信息