自动执行匿名 JavaScript 函数的括号位置?

我最近将json2.js的当前版本与项目中的版本进行了比较,并注意到函数表达式的创建和自我执行方式有所不同。

用于将匿名函数包装在括号中然后执行它的代码,

(function () {
  // code here
})();

但现在它将自动执行的函数包装在括号中。

(function () {
  // code here
}());

CMS在解释JavaScript的封装匿名函数语法的公认答案中有一个注释,“两者都是有效的”。(function(){})();(function(){}());

我想知道有什么区别?前者是否通过围绕全局匿名函数离开来占用内存?括号应位于何处?


答案 1

它们几乎是一样的。

第一个将括号括在函数周围,使其成为有效的表达式并调用它。表达式的结果是未定义的。

第二个执行函数,自动调用周围的括号使其成为有效的表达式。它还会评估为未定义。

我不认为有一种“正确”的方式来做到这一点,因为表达的结果是一样的。

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"

答案 2

在这种情况下,这并不重要。您正在调用解析为第一个定义中的函数的表达式,并在第二个示例中定义并立即调用函数。它们是相似的,因为第一个示例中的函数表达式只是函数定义。

对于调用解析为函数的表达式,还有其他更明显有用的情况:

(foo || bar)()