在Javascript中,自执行函数使用括号表示法是否有用?

11

当我看到JavaScript中自执行匿名函数的示例时,感到困惑,例如:

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

这种语法和以下语法有什么区别:

function() { return val;} ();

如果有人能给我一个明确的区别,那将有助于解决一直困扰我许久的问题...

4个回答

14
Javascript没有块级作用域,所以这是创建临时局部作用域的一种方式,不会污染全局命名空间。括号有两个目的:
  1. 一些javascript实现会出问题,如果缺少它们。
  2. 它向读者发出信号,表明正在进行与普通函数声明不同的操作。因此,惯例是它指示该函数正在用作作用域。
请参见:http://peter.michaux.ca/articles/an-important-pair-of-parens

6
在Safari 4中,以下代码(不包括括号)会导致“SyntaxError: Parse error”错误:
function() { alert("Test"); }();

但是下面的代码可以正常工作:

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

更新:我也在火狐浏览器3中(通过Firebug)尝试了这段代码,它的行为与Safari完全一样。


2
原因
function() { return val;} ();

由于它是一个函数声明而不是一个表达式,所以它无法正常工作。这是一个非常微小的区别,但基本上,如果语句以function开头,它就像一个C函数声明一样,你不能调用该函数,因为没有表达式值。
加括号使函数定义成为表达式的一部分,因此它具有值并且可以被调用。
将函数的返回值赋值给变量也消除了对括号的需求,因为函数定义不是整个语句。例如,以下内容有效:
var value = function() { alert("works"); return 0; }();
(function() { alert("works"); })();

但这个不行:
function() { alert("doesn't work"); }();

我总是包含括号,即使它们不是必需的,因为这样更容易看出我正在调用函数,而不是将其赋值给变量。


完全正确。还可以在这里看到:http://yura.thinkweb2.com/named-function-expressions/#expr-vs-decl - user123444555621

0
据我所知,唯一的区别在于后者有时在某些 ECMAScript 变体(即 ActionScript,但也可能有其他变体)中无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接