Does parenthetical notation for self-invoked functions serve a purpose in Javascript?
本问题已经有最佳答案,请猛点这里访问。
当我在Javascript中看到自调用匿名函数的示例时,我感到困惑,例如:
1 | (function () { return val;}) (); |
此语法与以下内容之间是否存在差异:
1 | function() { return val;} (); |
如果有人可以给我一个具体的区别,这将有助于解决一直困扰我多年的问题......
Javascript没有块作用域,因此这是一种创建不会污染全局名称空间的临时本地作用域的方法。括号有两个用途:
看这里:
http://peter.michaux.ca/articles/an-important-pair-of-parens
在Safari 4中,以下代码(没有括号)导致"SyntaxError:Parse error":
1 | function() { alert("Test"); }(); |
...但以下代码按预期工作:
1 | (function() { alert("Test"); })(); |
更新:我还尝试了Firefox 3中的代码(通过Firebug),它的行为就像Safari一样。
原因
1 | function() { return val;} (); |
不起作用是因为它是一个函数语句,而不是一个表达式。这是一个非常小的区别,但基本上,如果语句以
添加括号使得函数定义成为表达式的一部分,因此它具有值并且可以被调用。
分配函数的返回值也消除了对括号的需要,因为函数定义不是整个语句。例如,这些工作:
1 2 | var value = function() { alert("works"); return 0; }(); (function() { alert("works"); })(); |
但这不是:
1 | function() { alert("doesn't work"); }(); |
我总是包括括号,即使它们不是必需的,因为它更容易看到我正在调用函数,而不是将它分配给变量。
据我所知,唯一的区别是后者有时不适用于ECMAScript的某些风格(即ActionScript,但也可能有其他风格)。