java有類檔案、Python有import關鍵詞、Ruby有require關鍵詞、C#有using關鍵詞、PHP有include和require、CSS有@import關鍵詞,但是對ES5版本的javascript來說,javascript通過script标簽引入代碼的方式顯得雜亂無章,語言自身毫無組織和限制能力,人們不得不用指令空間等方式人為地限制代碼,以求達到安全和易用的目的。本文将詳細介紹javascript中的子產品組織
反模式(Anti-Pattern)指沒有使用任何子產品系統
簡單地,把不同的函數(以及記錄狀态的變量)放在一起,就算是一個子產品
上面的函數m1()和m2(),組成一個子產品。使用的時候,直接調用就行了。
這種做法的缺點很明顯:"污染"了全局變量,無法保證不與其他子產品發生變量名沖突,而且子產品成員之間看不出直接關系
為了解決上面的缺點,可以把子產品寫成一個字面量,所有的子產品成員都放到這個對象裡面
上面的函數m1()和m2(),都封裝在module1對象裡。使用的時候,就是調用這個對象的屬性
但這種寫法會暴露所有子產品成員,内部狀态可被外部改寫。比如,外部代碼可以直接改變内部計數器的值
使用"立即執行函數"(Immediately-Invoked Function Expression,IIFE)可以達到不暴露私有成員的目的
使用上面的寫法,外部代碼無法讀取内部的_count變量
如果一個子產品需要繼承另一個子產品,則需要IIFE傳參
如果采用IIFE的方法,随着子產品的增多,仍然污染了全局環境。
而命名空間(Namespace)可以通過隻暴露類似于一個'namespace'的全局變量,來實作所有子產品的聲明,進而解決全局環境的污染問題
雖然,使用命名空間可以解決全局環境污染的問題,但是卻無法解決子產品依賴管理的問題
如下圖所示,module2依賴于module1和module3,則代碼如下

但,如果子產品組織如下所示
甚至,如下所示
這時,手動地處理子產品之間的依賴關系就不現實了,需要使用AMD、CMD、ES6 MODULE等來處理
本文轉自xsster51CTO部落格,原文連結:http://blog.51cto.com/12945177/1948456 ,如需轉載請自行聯系原作者