2015-02-05 62 views
2

我正在查看由TypeScript編譯器生成的一些代碼,並且我注意到它正在將外露對象模式的函數封裝在額外的括號中。我認爲這是有原因的,原因是什麼?顯示模塊模式中的左括號

var Castle = (function() { 
function Castle(name) { 
    this.name = name; 
} 
Castle.prototype.Build = function() { 
    var element = document.getElementById("textArea"); 
    console.log("Built " + this.name); 
}; 
return Castle; 
})(); 
var test = new Castle("Winterfell"); 
test.Build(); 

注意外部函數在()中。代碼似乎沒有他們正常工作。

+0

權力的遊戲應用程序? =) – plalx 2015-02-05 19:16:43

+0

它實際上是一個來自https://www.packtpub.com/application-development/mastering-javascript-design-patterns的討論,所有的例子都是相關的權力遊戲。免責聲明:我寫了那本書。 – stimms 2015-02-06 20:05:29

回答

3

這只是爲了清楚說明由函數表達式組成的內容。

顯然,作品,以及:

var test = function() { return 'test'; }(); 

然而,有一個細微的差別:

var test = (function() { return 'test'; })(); 

與一個沒有包裝括號除了是不太清楚其他的主要區別,是上下文定義我們的函數是被解釋爲函數表達式還是函數聲明。例如,如果您要從第一個樣本中刪除var test =,則會因爲無法調用函數聲明而導致語法錯誤。

如果他們的目標是吐出可讀的代碼,那麼這可能是他們選擇使用包裝圓括號的原因。

另一方面,並​​非所有人都認同正確的IIFE形式。

E.g. Crockford的建議:

var test = (function() { return 'test'; }());