自动执行匿名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个字节更大的文件 ;-)}