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

我最近将json2.js的当前版本与我在项目中使用的版本进行了比较,并注意到函数expression式是如何创build和自我执行的。

代码用于包装一个匿名函数括号,然后执行它,

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

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

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

在接受的解释JavaScript的封装的匿名函数语法的回答中,CMS有一个评论:“ (function(){})();(function(){}()); 有效“。

我想知道有什么不同? 前者是否通过留下一个全球匿名的function来记忆? 圆括号应该放在哪里?

他们几乎是一样的。

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

第二个函数执行该函数,自动调用周围的括号使其成为一个有效的expression式。 它也评估为未定义的。

我不认为有这样做的“正确”方式,因为expression的结果是相同的。

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

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

还有其他更明显有用的情况来调用parsing为函数的expression式:

 (foo || bar)() 

语法之外没有任何区别。

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

考虑:

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

即使您提供了名称, namedfunc仍然不在全局范围内。 匿名函数也是一样。 在这个范围内得到它的唯一方法就是把它分配给parens中的一个variables。

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

外面的parens是不必要的:

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

但是你不想要那个全球性的声明,是吗?

所以它归结为:

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

你可以进一步减less它:这个名字是不必要的,因为它永远不会被使用(除非你的函数是recursion的,甚至可以使用arguments.callee

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

这就是我考虑的方式(可能不正确,我还没有阅读ECMAScript规范)。 希望它有帮助。

只是因为道格拉斯· 克罗克福德 不喜欢 IIFE的第一种风格而存在差异 ! (seriuosly) 正如你可以看到在这个video! 。

在这两种样式中,额外的wrap () { ()的存在的唯一原因是帮助生成代码Function Expression的这一段,因为函数声明不能被立即调用。 一些脚本/缩略图只是使用+ ,! ,而不是太括号。 喜欢这个:

 +function() { var foo = 'bar'; }(); !function() { var foo = 'bar'; }(); -function() { var foo = 'bar'; }(); ~function() { var foo = 'bar'; }(); 

所有这些都和你的select完全一样。 在这些案例中select完全是你自己的,并没有什么区别。 {用()生成1个字节更大的文件 ;-)}