1)function () {
// code here...
}();
2)(function () {
// code here...
})();
3)(function () {
// code here...
}());
有什么区别(尤其是第三种变体)?它们都一样吗?
1)function () {
// code here...
}();
2)(function () {
// code here...
})();
3)(function () {
// code here...
}());
有什么区别(尤其是第三种变体)?它们都一样吗?
2 和 3 完全等价。它们之间没有功能上的区别。
1 是语法错误。因为函数没有括在括号中,所以它被视为函数声明。它是无效的,因为函数声明需要命名。括号使其成为“函数表达式”;这些不需要命名。
第一个给出语法错误。第二个和第三个版本定义了一个匿名函数并立即执行它。第二和第三版本也称为立即调用函数表达式。
您可能还会遇到另一个看起来像这样的版本。这在功能上与第 2 版和第 3 版相同,但它只是否定了返回值。
!function() {
//some code
}()
第一个无效,但是您可以执行以下操作以使其正常工作:
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”!