首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自动执行匿名JavaScript函数的括号位置?

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

Stack Overflow用户
提问于 2010-08-02 09:39:39
回答 3查看 14.3K关注 0票数 107

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

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

代码语言:javascript
复制
(function () {
  // code here
})();

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

代码语言:javascript
复制
(function () {
  // code here
}());

Explain JavaScript’s encapsulated anonymous function syntax的公认答案中有一条评论:“(function(){})();(function(){}());都是有效的。”

我想知道有什么不同?前者是否通过留下一个全局的匿名函数来占用内存?括号应该放在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-02 09:49:18

它们实际上是一样的。

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

第二个函数执行函数,自动调用前后的圆括号使其成为有效的表达式。它的计算结果也是未定义的。

我不认为有一种“正确”的方法,因为表达式的结果是相同的。

代码语言:javascript
复制
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
票数 66
EN

Stack Overflow用户

发布于 2010-08-02 09:49:37

在这种情况下,这无关紧要。您将在第一个定义中调用一个解析为函数的表达式,并在第二个示例中定义并立即调用一个函数。它们之所以相似,是因为第一个示例中的函数表达式就是函数定义。

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

代码语言:javascript
复制
(foo || bar)()
票数 13
EN

Stack Overflow用户

发布于 2010-08-02 10:35:59

除了语法之外,没有任何区别。

关于您对第二种方法的担忧:

考虑一下:

(function namedfunc () { ... }())

即使您提供了名称,namedfunc仍然不在全局作用域中。匿名函数也是如此。将其放入该作用域的唯一方法是将其赋给括号内的一个变量。

代码语言:javascript
复制
((namedfunc = function namedfunc () { ... })())

外括号是不必要的:

代码语言:javascript
复制
(namedfunc = function namedfunc () { ... })()

但无论如何你都不想要那个全球声明,对吧?

所以它可以归结为:

代码语言:javascript
复制
(function namedfunc () { ... })()

您还可以进一步减少它:名称是不必要的,因为它永远不会被使用(除非您的函数是递归的..即使这样,你也可以使用arguments.callee)

代码语言:javascript
复制
(function () { ... })()

这就是我对它的看法(可能不正确,我还没有读过ECMAScript规范)。希望能有所帮助。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3384504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档