执行匿名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

上一篇: executing anonymous JavaScript functions?

下一篇: Creating an abstract class in Objective