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

}();

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

})();



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

}());

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

4

3 回答 3

2

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

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

于 2011-10-04T11:16:21.090 回答
2

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

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

!function() {
   //some code
}()
于 2011-10-04T11:18:55.533 回答
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”!

于 2013-03-08T14:25:38.197 回答