执行匿名JavaScript函数?
我最近将json2.js的当前版本与我在项目中使用的版本进行了比较,并注意到函数表达式的创建方式和自我执行方式存在差异。
用于将括号中的匿名函数包装并执行的代码,
(function () {
// code here
})();
但现在它将自动执行的功能封装在括号中。
(function () {
// code here
}());
在解释JavaScript封装的匿名函数语法的接受答案中,CMS提出了一个评论:“ (function(){})();
和(function(){}());
是有效的“。
我想知道有什么区别? 前者是否通过留下一个全球性的匿名功能而留下记忆? 圆括号应该放在哪里?
他们几乎是一样的。
第一个包围函数的括号以使其成为有效的表达式并调用它。 表达式的结果是未定义的。
第二个函数执行该函数,自动调用周围的括号使其成为有效的表达式。 它也评估为未定义。
我不认为有这样做的“正确”方式,因为表达的结果是相同的。
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
在这种情况下,这并不重要。 您正在调用一个解析为第一个定义中的函数的表达式,并在第二个示例中定义并立即调用一个函数。 它们很相似,因为第一个例子中的函数表达式只是函数定义。
还有其他更明显有用的情况用于调用解析为函数的表达式:
(foo || bar)()
除语法外没有任何区别。
关于你对第二种方法的担忧:
考虑:
(function namedfunc () { ... }())
即使您提供了名称, namedfunc
仍然不在全局范围内。 匿名函数也是如此。 获得该范围的唯一方法是将其分配给parens中的变量。
((namedfunc = function namedfunc () { ... })())
外面的parens是不必要的:
(namedfunc = function namedfunc () { ... })()
但是你不想要那个全球性的声明,是吗?
所以它归结为:
(function namedfunc () { ... })()
而且你可以进一步减少它:这个名字是不必要的,因为它永远不会被使用(除非你的函数是递归的,甚至你可以使用arguments.callee
)
(function () { ... })()
这是我考虑的方式(可能不正确,我还没有阅读ECMAScript规范)。 希望能帮助到你。
链接地址: http://www.djcxy.com/p/51505.html