在JavaScript中“(函数(){}()”和“(函数(){}())”在功能上是相等的吗?

在JavaScript中“(函数(){}()”和“(函数(){}())”在功能上是相等的吗?,javascript,function,Javascript,Function,这两个代码块都位于alert foo then bar下面。唯一的区别是}和} 代码1: (function() { bar = 'bar'; alert('foo'); })(); alert(bar); 代码2: (function() { bar = 'bar'; alert('foo'); }()); alert(bar); 那么,除了语法之外,还有什么区别吗?没有;它们是一样的 然而,如果你在之前和之后添加新的东西,它们会有所不同 代码1 此代码

这两个代码块都位于alert foo then bar下面。唯一的区别是}和}

代码1:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);
代码2:

(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);
那么,除了语法之外,还有什么区别吗?

没有;它们是一样的

然而,如果你在之前和之后添加新的东西,它们会有所不同

代码1 此代码创建此函数类的新实例,然后获取新实例的prop属性。 它返回4

相当于

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;
代码2 此代码在类属性上调用new。 由于函数调用的圆括号位于圆括号的外部集合内,因此新表达式不会拾取圆括号,而是正常调用函数,返回其返回值。 新表达式解析到.Class并实例化它。new后面的括号是可选的

相当于

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;
var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;

如果对getNamespace的调用没有括号,它将被解析为新的getNamespace.Class-它将调用实例化getNamespace类并返回新实例的Class属性。

没有区别。两者都是函数表达式

还有第三种方法:

+function() {
    bar = 'bar';
    alert('foo');
}();
另一个操作员也会工作,而不是+的

最常见的方法是

(function() {
    // ...
})();

尽管如此。

没有区别-大括号只是一个语法提示,告诉解析器下面是函数表达式而不是函数声明。

新的…prop示例很有帮助。谢谢。如果在JavaScript中不使用分号,那么直接在前面加上标识符也会有区别,这可能是偶然发生的。函数{return 5;}减少为a5,而函数{return 5;}减少为a,进一步减少为5,这是非法的。实际上,括号充当代码2上的临时匿名变量。您还可以编写var f=函数{…};它将输出相同的结果。自调用函数的名称有误导性,因为该函数不会在其主体中递归调用自身,但会在定义后立即调用它。我宁愿调用它立即调用的函数。也可以看到,或者当你认为JS中的所有东西都不是你所期望的——它是。又被骗了!js第一语言使用反向心理学!!!