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

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

}();

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

})();



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

}());

它们有什么不同之处(尤其是第三种变体)?它们都一样吗?

你可以在以下链接中找到更多信息:https://dev59.com/CnRC5IYBdhLWcg3wAcQ3 和 https://dev59.com/oXRC5IYBdhLWcg3wD8xV - Narendra Yadala
3个回答

2

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

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

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

不,这并不是因为否定运算符而导致语法错误。这种形式只是执行函数、对返回值取反并将其返回给调用者。 - Narendra Yadala
你可能想看一下这个链接http://benalman.com/news/2010/11/immediately-invoked-function-expression/。它涵盖了大多数自执行函数的形式及其差异。 - Narendra Yadala

2

2和3是完全等价的。它们之间没有功能上的区别。

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


“1”有两个语法错误。首先,像你说的那样,函数声明需要命名,但是因为尾随的()不是有效的语法,所以也会出错。即使它被命名了,它也肯定不会执行刚刚声明的函数... - davin
@davin 嗯,是的,但由于之前的错误,解析器甚至无法到达那一点。 - lonesomeday

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”!


1
如果你关心返回值,尤其是在编程中,你不应该使用new - Bergi
如果您使用 new function(){},这将返回一个带有 constructor 属性的对象,我可以再次运行该函数,但这会被非 new 示例或 IIFE 示例所防止。 - Muhammed Albarmavi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接