1)function () {
// code here...
}();
2)(function () {
// code here...
})();
3)(function () {
// code here...
}());
它们有什么不同之处(尤其是第三种变体)?它们都一样吗?
1)function () {
// code here...
}();
2)(function () {
// code here...
})();
3)(function () {
// code here...
}());
第一个会报语法错误。第二个和第三个版本定义了一个匿名函数并立即执行它。第二个和第三个版本也被称为立即调用函数表达式。
你可能还会遇到另一个版本,它看起来像这样。它在功能上等同于第二个和第三个版本,但它只是否定了返回值。
!function() {
//some code
}()
2和3是完全等价的。它们之间没有功能上的区别。
1是语法错误。因为函数没有用括号包裹,所以它被视为函数声明。但是函数声明需要命名,所以它是无效的。括号使其成为“函数表达式”,这些不需要命名。
()
不是有效的语法,所以也会出错。即使它被命名了,它也肯定不会执行刚刚声明的函数... - davin第一个不是有效的,但您可以尝试以下方法使其工作:
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”!
new
。 - Berginew function(){}
,这将返回一个带有 constructor 属性的对象,我可以再次运行该函数,但这会被非 new 示例或 IIFE 示例所防止。 - Muhammed Albarmavi