摘要
你能解释一下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);
}();
你能给我解释一下吗?
发布于 2012-08-26 12:02:50
尽管这是一个古老的问答,但它讨论了一个至今仍让许多开发人员感到困惑的主题。我已经数不清我面试过的JavaScript开发人员中有多少人不能告诉我函数声明和函数表达式之间的区别,也不知道什么是立即调用的函数表达式。
我想提一下,不过,有一件非常重要的事情是,即使Premasagar给了它一个名称标识符,它的代码片段也不会工作。
function someName() {
alert(2 + 2);
}();
这种方法不起作用的原因是,JavaScript引擎将其解释为一个函数声明,后跟一个完全不相关的分组操作符,该操作符不包含任何表达式,并且分组操作符必须包含一个表达式。根据JavaScript的说法,上面的代码片段等同于下面的代码片段。
function someName() {
alert(2 + 2);
}
();
我想指出的另一件事可能对某些人有用,那就是您为函数表达式提供的任何名称标识符在代码上下文中几乎都是无用的,除非是在函数定义本身中。
var a = function b() {
// do something
};
a(); // works
b(); // doesn't work
var c = function d() {
window.setTimeout(d, 1000); // works
};
当然,在调试代码时,在函数定义中使用名称标识符总是很有帮助的,但这完全是另一回事……:-)
发布于 2011-12-02 08:53:04
我只有一个小小的评论。您的代码只需稍作更改即可正常工作:
var x = function(){
alert(2 + 2);
}();
我使用上面的语法,而不是更广泛的版本:
var module = (function(){
alert(2 + 2);
})();
因为我没有设法让缩进在vim中正确地处理javascript文件。似乎vim不喜欢左括号里的花括号。
发布于 2016-06-24 03:46:08
(function(){
alert(2 + 2);
})();
上面的语法是有效的,因为圆括号中传递的任何内容都被视为函数表达式。
function(){
alert(2 + 2);
}();
以上不是有效语法。因为java脚本语法分析器一个接一个地查找函数名和关键字,所以它没有找到任何东西,所以会抛出一个错误。
https://stackoverflow.com/questions/1634268
复制相似问题