【发布时间】:2010-12-10 16:39:35
【问题描述】:
总结
您能解释一下 JavaScript 中封装匿名函数的语法背后的原因吗?为什么这行得通:(function(){})();,但这行不通:function(){}();?
我知道的
在 JavaScript 中,创建一个命名函数,如下所示:
function twoPlusTwo(){
alert(2 + 2);
}
twoPlusTwo();
您还可以创建一个匿名函数并将其分配给一个变量:
var twoPlusTwo = function(){
alert(2 + 2);
};
twoPlusTwo();
你可以通过创建一个匿名函数来封装一段代码,然后将其包裹在括号中并立即执行:
(function(){
alert(2 + 2);
})();
这在创建模块化脚本时很有用,可以避免将当前范围或全局范围与潜在的冲突变量混淆 - 例如 Greasemonkey 脚本、jQuery 插件等。
现在,我明白为什么会这样了。括号括起内容并仅显示结果(我相信有更好的方式来描述它),例如(2 + 2) === 4。
我不明白的地方
但我不明白为什么这不能同样有效:
function(){
alert(2 + 2);
}();
你能给我解释一下吗?
【问题讨论】:
-
我认为所有这些不同的符号和定义/设置/调用函数的方式是最初使用 javascript 最令人困惑的部分。人们也倾向于不谈论它们。这不是指南或博客中的重点。这让我大吃一惊,因为这对大多数人来说都是令人困惑的事情,而精通 js 的人一定也经历过。这就像这个永远不会被谈论的空洞禁忌现实。
-
另请阅读purpose of this construct,或查看(technical)explanation(也可查看here)。有关括号的位置,请参阅this question about their location。
-
OT:想知道这些匿名函数用在哪里的朋友,请阅读adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
-
这是立即调用函数表达式 (IIFE) 的典型案例。
标签: javascript syntax anonymous-function