这三种模块模式有什么区别?

时间:2011-10-04 11:13:17

标签: javascript self-invoking-function

1)function () { 
    // code here...

}();

2)(function () { 
    // code here...

})();



3)(function () { 
    // code here...

}());

有什么区别(特别是第三种变体)?它们都一样吗?

3 个答案:

答案 0 :(得分:2)

2和3完全相同。它们之间没有功能差异。

1是语法错误。因为函数没有包含在括号中,所以它被视为函数声明。它无效,因为需要命名函数声明。括号使其成为“函数表达式”;这些不需要命名。

答案 1 :(得分:2)

第一个给出语法错误。第二个和第三个版本定义匿名函数并立即执行它。第二个和第三个版本也称为立即调用函数表达式。

您可能还会遇到另一个看起来像这样的版本。这在功能上与第二版和第三版相同,但它只是否定了返回值。

!function() {
   //some code
}()

答案 2 :(得分:2)

第一个无效,但您可以执行以下操作:

var myfunction = function () { 
    // code here...
}();

正如其他答案所指出的那样,第二和第三之间没有区别,它们是相同的。

以下也是有效的,而不是使用括号:

!function() { /*  code here... */ }();
~function() { /*  code here... */ }();
+function() { /* code here... */ }();
-function() { /*  code here... */ }();
new function() { /*  code here... */ };
new function(arguments) { /*  code here... */ }(arg);

注意:人们习惯称这些函数为“自执行匿名函数”,但该术语不正确。现在他们被称为'立即调用函数表达式(IIFE)'发音为“iffy”!