为什么要这样做:
(function () {
//code
}());
以及这个:
var f = function () {
//code
}();
这段代码有效,而这段代码:
function () {
//code
}();
看起来不一样吗?它们完全相同-定义了匿名函数并立即调用。有人能引用JavaScript/ECMAScript标准中解释这一点的语句吗?
更新:感谢大家的回答!因此,这涉及到函数表达式 vs. 函数声明。请参见这个Stack Overflow答案、ECMAScript标准第13节以及这篇很棒的文章:具名函数表达式的神秘化解。
总结答案:
第一个代码段被解释为表达式,因为应用了分组运算符
()
——请参见ECMAScript标准第11.1.6节。在第二个代码段中,该函数被解释为表达式,因为它位于赋值运算符
=
的右侧。第三个代码段没有任何东西可以让解释器将该函数视为表达式,因此它被视为声明,而声明没有标识符是无效的(Gecko允许它通过,但它在后面遇到
()
分组运算符时会出错(因为它认为正在应用于无效内容))。