最近,我将json2.js的当前版本与项目中的版本进行了比较,注意到函数表达式的创建和自执行方式有所不同。
用于将匿名函数包装在括号中然后执行它的代码,
(function () {
// code here
})();
但现在它将自动执行的函数包含在括号中。
(function () {
// code here
}());
在Explain JavaScript’s encapsulated anonymous function syntax的公认答案中有一条评论:“(function(){})();
和(function(){}());
都是有效的。”
我想知道有什么不同?前者是否通过留下一个全局的匿名函数来占用内存?括号应该放在哪里?
发布于 2010-08-02 09:49:18
它们实际上是一样的。
第一个函数使用圆括号将函数括起来,使其成为有效的表达式并调用它。表达式的结果是未定义的。
第二个函数执行函数,自动调用前后的圆括号使其成为有效的表达式。它的计算结果也是未定义的。
我不认为有一种“正确”的方法,因为表达式的结果是相同的。
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
发布于 2010-08-02 09:49:37
在这种情况下,这无关紧要。您将在第一个定义中调用一个解析为函数的表达式,并在第二个示例中定义并立即调用一个函数。它们之所以相似,是因为第一个示例中的函数表达式就是函数定义。
对于调用解析为函数的表达式,还有其他更明显的有用情况:
(foo || bar)()
发布于 2010-08-02 10:35:59
除了语法之外,没有任何区别。
关于您对第二种方法的担忧:
考虑一下:
(function namedfunc () { ... }())
即使您提供了名称,namedfunc
仍然不在全局作用域中。匿名函数也是如此。将其放入该作用域的唯一方法是将其赋给括号内的一个变量。
((namedfunc = function namedfunc () { ... })())
外括号是不必要的:
(namedfunc = function namedfunc () { ... })()
但无论如何你都不想要那个全球声明,对吧?
所以它可以归结为:
(function namedfunc () { ... })()
您还可以进一步减少它:名称是不必要的,因为它永远不会被使用(除非您的函数是递归的..即使这样,你也可以使用arguments.callee
)
(function () { ... })()
这就是我对它的看法(可能不正确,我还没有读过ECMAScript规范)。希望能有所帮助。
https://stackoverflow.com/questions/3384504
复制相似问题