在JavaScript中,“(function(){})()”和“(function(){}())”功能是否相同?

下面的这两个代码块都会提示foo然后bar 。 唯一的区别是})()}())

代码1:

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

代码2:

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

除了语法之外,还有什么区别吗?

没有; 他们是相同的


但是,如果事先添加new和之后的东西,它们将会不同。

代码1

 new (function() { this.prop = 4; }) ().prop; 

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

这相当于

 function MyClass() { this.prop = 4; } new MyClass().prop; 

代码2

 new ( function() { return { Class: function() { } }; }() ).Class; 

此代码在Class属性上调用new
由于函数调用的圆括号在外部括号内,因此不会被new表达式拾取,而是通常调用函数,返回其返回值。
new表达式解析到.Class并实例化。 ( new的后面的括号是可选的)

这相当于

 var namespace = { Class: function() { } }; function getNamespace() { return namespace; } new ( getNamespace() ).Class; //Or, new namespace.Class; 

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

没有什么区别 – 左括号仅作为语法提示来告诉解析器,接下来是函数表达式而不是函数声明

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

还有第三种方法:

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

(而不是+另一个操作员也会工作)

最常见的方式是

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

虽然。