2011-05-09 66 views
52

这两个代码块都在报警foo,然后bar以下。唯一的区别是})()}())在JavaScript中,“(function(){})()”和“(function(){}())”在功能上是否相等?

代码1:

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

alert(bar); 

代码2:

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

alert(bar); 

那么,有任何差别,除了语法?

+1

另请参见[自动执行匿名JavaScript函数的括号位置?](http://stackoverflow.com/questions/3384504/location-of-parenthesis-for-auto-executing-anonymous-javascript-functions)或[函数(){...}())之间有区别吗?和(函数(){...})();?](http://stackoverflow.com/questions/3783007/is-there-a-difference-between-function-and-function) – Bergi 2013-10-23 20:29:57

+1

只是当你认为一切都在JS不是你所期望的 - 它是。再次欺骗! js第一语言使用反向pschology! – 2013-11-07 15:53:15

回答

58

否;它们是相同的


但是,如果添加new事前和事后.something,他们也会有所不同。

代码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财产的新实例。

+1

'new ... prop'示例很有帮助。谢谢。 – 2011-05-09 15:18:23

+1

不客气。 – SLaks 2011-06-14 16:11:09

+1

每当它直接在标识符前面时,也有一个区别,如果您在JavaScript中不使用分号,则可能会偶然发生这种情况。 'a(function(){return 5;}())'缩小为'a(5)',而'a(function(){return 5;})()'简化为'a()减少到'5()',这是非法的。 – Keen 2013-08-15 18:35:42

6

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

有是第三条道路,太:

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

(而不是+另算会的工作,太)

最常见的方式是

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

虽然。

+2

http://jsperf.com/self-invoking-function – 2012-12-17 05:51:09

+1

命名为“自我调用函数”是一种误导,因为该功能不会在它的身上调用自身递归,但它是*是*定义后立即调用。我宁愿将它称为“立即调用函数”。 – SasQ 2014-05-19 19:30:53

7

有没有区别 - 左括号只充当句法提示告诉解析器接下来就是函数表达式而不是函数声明

相关问题