天天看點

實作javascript下的子產品組織

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,則代碼如下

實作javascript下的子產品組織

  但,如果子產品組織如下所示

實作javascript下的子產品組織

  甚至,如下所示

實作javascript下的子產品組織

  這時,手動地處理子產品之間的依賴關系就不現實了,需要使用AMD、CMD、ES6 MODULE等來處理

本文轉自xsster51CTO部落格,原文連結:http://blog.51cto.com/12945177/1948456 ,如需轉載請自行聯系原作者