2011-05-09 63 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

有沒有區別 - 左括號只充當句法提示告訴解析器接下來就是函數表達式而不是函數聲明

相關問題