自调用函数的括号表示法是否在Javascript中有用?

时间:2009-04-15 03:48:17

标签: javascript functional-programming scope

当我在Javascript中看到自调用匿名函数的示例时,我感到困惑,例如:

(function () { return val;}) ();

此语法与以下内容有何区别:

function() { return val;} ();

如果有人可以给我一个具体的区别,这将有助于解决一个困扰我多年的问题......

4 个答案:

答案 0 :(得分:14)

Javascript没有块作用域,因此这是一种创建不会污染全局名称空间的临时本地作用域的方法。括号有两个目的:

  1. 如果javascript丢失,javascript的一些实现就会被淘汰。
  2. 向读者发出与正常功能声明不同的信息。因此,作为惯例,它表示此功能正用作范围。
  3. 见这里: http://peter.michaux.ca/articles/an-important-pair-of-parens

答案 1 :(得分:6)

在Safari 4中,以下代码(没有括号)导致“SyntaxError:Parse error”:

function() { alert("Test"); }();

...但以下代码按预期工作:

(function() { alert("Test"); })();

更新:我还尝试了Firefox 3中的代码(通过Firebug),它的行为就像Safari一样。

答案 2 :(得分:2)

原因

function() { return val;} ();

不起作用是因为它是一个函数语句,而不是表达式。这是一个很小的区别,但基本上,如果语句以function开头,它就像一个C函数声明,你不能调用该函数,因为没有表达式值。

添加括号使得函数定义成为表达式的一部分,因此它具有一个值并且可以被调用。

分配函数的返回值也消除了对括号的需要,因为函数定义不是整个语句。例如,这些工作:

var value = function() { alert("works"); return 0; }();
(function() { alert("works"); })();

但这不是:

function() { alert("doesn't work"); }();

我总是包括括号,即使它们不是必需的,因为它更容易看到我正在调用函数,而不是将它分配给变量。

答案 3 :(得分:0)

据我所知,唯一的区别是后者有时在ECMAScript的某些风格中不起作用(即ActionScript,但也可能有其他风格)。