首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解释封装的匿名函数语法

解释封装的匿名函数语法
EN

Stack Overflow用户
提问于 2009-10-28 07:23:11
回答 6查看 77.4K关注 0票数 391

摘要

你能解释一下JavaScript中封装匿名函数的语法背后的原因吗?为什么这行得通:(function(){})();,但这行不通:function(){}();

我所知道的

在JavaScript中,可以创建一个命名函数,如下所示:

代码语言:javascript
复制
function twoPlusTwo(){
    alert(2 + 2);
}
twoPlusTwo();

您还可以创建一个匿名函数并将其分配给一个变量:

代码语言:javascript
复制
var twoPlusTwo = function(){
    alert(2 + 2);
};
twoPlusTwo();

您可以通过创建匿名函数,然后将其包装在括号中并立即执行来封装代码块:

代码语言:javascript
复制
(function(){
    alert(2 + 2);
})();

当创建模块化脚本时,这是很有用的,以避免当前作用域或全局作用域与潜在冲突变量的混乱-就像在Greasemonkey脚本、jQuery插件等的情况下。

现在,我明白为什么这是可行的了。括号包含内容并仅公开结果(我相信有更好的方式来描述它),例如使用(2 + 2) === 4

我不明白的是

但我不明白为什么这个不能同样有效:

代码语言:javascript
复制
function(){
    alert(2 + 2);
}();

你能给我解释一下吗?

EN

回答 6

Stack Overflow用户

发布于 2012-08-26 12:02:50

尽管这是一个古老的问答,但它讨论了一个至今仍让许多开发人员感到困惑的主题。我已经数不清我面试过的JavaScript开发人员中有多少人不能告诉我函数声明和函数表达式之间的区别,也不知道什么是立即调用的函数表达式。

我想提一下,不过,有一件非常重要的事情是,即使Premasagar给了它一个名称标识符,它的代码片段也不会工作。

代码语言:javascript
复制
function someName() {
    alert(2 + 2);
}();

这种方法不起作用的原因是,JavaScript引擎将其解释为一个函数声明,后跟一个完全不相关的分组操作符,该操作符不包含任何表达式,并且分组操作符必须包含一个表达式。根据JavaScript的说法,上面的代码片段等同于下面的代码片段。

代码语言:javascript
复制
function someName() {
    alert(2 + 2);
}

();

我想指出的另一件事可能对某些人有用,那就是您为函数表达式提供的任何名称标识符在代码上下文中几乎都是无用的,除非是在函数定义本身中。

代码语言:javascript
复制
var a = function b() {
    // do something
};
a(); // works
b(); // doesn't work

var c = function d() {
    window.setTimeout(d, 1000); // works
};

当然,在调试代码时,在函数定义中使用名称标识符总是很有帮助的,但这完全是另一回事……:-)

票数 54
EN

Stack Overflow用户

发布于 2011-12-02 08:53:04

我只有一个小小的评论。您的代码只需稍作更改即可正常工作:

代码语言:javascript
复制
var x = function(){
    alert(2 + 2);
}();

我使用上面的语法,而不是更广泛的版本:

代码语言:javascript
复制
var module = (function(){
    alert(2 + 2);
})();

因为我没有设法让缩进在vim中正确地处理javascript文件。似乎vim不喜欢左括号里的花括号。

票数 3
EN

Stack Overflow用户

发布于 2016-06-24 03:46:08

代码语言:javascript
复制
(function(){
     alert(2 + 2);
 })();

上面的语法是有效的,因为圆括号中传递的任何内容都被视为函数表达式。

代码语言:javascript
复制
function(){
    alert(2 + 2);
}();

以上不是有效语法。因为java脚本语法分析器一个接一个地查找函数名和关键字,所以它没有找到任何东西,所以会抛出一个错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1634268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档