2012-07-16 30 views
8

我已經看過所有其他(優秀)答案(尤其是這個:How do JavaScript closures work?),但我希望你對我對這個概念的理解有所反饋。這是JavaScript封閉的有效用例嗎?

我知道一個用例就是隱藏公共訪問的私有方法的實現。

另外一個,我覺得是有它作爲一個廠發電機:

<script> 

function carFactory(make) { 

    var m = make; 
    return { manufacture: function (model) 

     {console.log("A " + m + " " + model + " has been created");} 

    } 
} 

toyotaFactory = carFactory("toyota"); 
hondaFactory = carFactory("honda"); 

toyotaFactory.manufacture("corolla"); 
toyotaFactory.manufacture("corolla"); 
hondaFactory.manufacture("civic"); 

</script> 

此輸出:

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

那麼你認爲其倒閉的有效使用情況下(即創建多個工廠使用相同的代碼庫)?或者我可以使用更好的東西來實現相同的目標?

請注意,問題不在於關閉的技術實現,更多關於應用程序設計/開發中有效用例的問題。

謝謝。

+0

對我來說沒關係。 – Almo 2012-07-16 00:23:01

+0

看起來不錯!我沒有看到任何錯誤。 – Linuxios 2012-07-16 00:24:28

+3

從技術上講,你不需要'm' - 你可以直接使用'make'。 – josh3736 2012-07-16 00:33:33

回答

0

閉包是非常強大的構造,具有許多有用的用途。你在那裏使用的那種實際上是一種「黑客」。閉包最常見的用法是,當你實現了一些在中間「做某些事情」的功能時......並且「做某事」可以根據需要進行更多或更少的配置......例如jQuery ajax功能當請求有錯誤,或者當它成功時,可以「做些什麼」等等。 如果你沒有關閉,你只能通過一個「靜態定義」的功能,這可能需要從全局變量中收集所需的上下文以完成您想要的任務,或者您必須對所有函數使用相同的簽名,例如在C或C++中完成的函數(如函數(customData)){} ... Closures允許你在運行時「動態構建函數」,重新創建它們創建時的上下文,這樣你就可以以一種非常簡單的方式傳遞給需要「做某件事」的模塊,你會用c或C++或不用closu這是醜陋的,容易出錯的,也是一種黑客)。

所以每當你必須「設置」裏面的東西了一些自定義功能,您將使用一個封閉...

1

如果我正確理解你的問題,你不關心保持make私有財產?如果是這樣的話,那麼封閉是不是真的有必要,你可以使用原型實現相同的功能...

function carFactory(model){ 
    this.m = make; 
} 

carFactory.prototype.manufacture = function(model){ 
    console.log('A ' + this.m + ' ' + model + ' has been created'); 
} 

其中有相關的性能優勢(降低內存和增加的速度),按this question

+1

這存儲模型名稱,但不保密。成員變量可供任何人使用。OP封閉的優勢在於型號名稱是真正私人的。 – jfriend00 2012-07-16 00:44:33

+0

是的,編輯我的答案是更具體一點。這只是一個可行的答案,如果保持'make'私密是不必要的。如果是,那麼封閉是最好的解決方案。 – market 2012-07-16 00:48:49

+1

我認爲在OP的問題中關閉的關鍵是隱私。我同意,如果不需要隱私,那麼關閉會比需要更復雜(並且可能更糟糕的內存消耗)。如果是公共的,一個成員變量是最直接的。 – jfriend00 2012-07-16 00:56:17