需要模塊管理的原因就是JavaScript發(fā)展的越來(lái)越快,超過(guò)了它產(chǎn)生時(shí)候的自我定位。由于沒(méi)有模塊管理的概念,在做大型項(xiàng)目或者文件組織的時(shí)候,就會(huì)異常糾結(jié)。所以才會(huì)產(chǎn)生出這么多的模塊管理工具。模塊化的主要特征是:
- 模塊化,可重用
- 封裝了變量和function,和全局的namaspace不接觸,松耦合
- 只暴露可用public的方法,其它私有方法全部隱藏
實(shí)現(xiàn)方式
初級(jí)階段,代碼中充斥的是各種函數(shù),通過(guò)名稱區(qū)分:
function func1() {}
function func2() {}
實(shí)際上這些函數(shù)都被掛載到了全局變量下,使用的時(shí)候可以直接調(diào)用,缺點(diǎn)就是: "污染"了全局變量,無(wú)法保證不與其他模塊發(fā)生變量名沖突,而且模塊成員之間看不出直接關(guān)系。
對(duì)象寫法
解決上述污染問(wèn)題,可以把模塊寫成一個(gè)對(duì)象,所有的模塊成員都放到這個(gè)對(duì)象里面。
var module1 = new Object({
_count: 0,
m1: function() {
//...
},
m2: function() {
//...
}
});
// 等價(jià)于
var module2 = {
_count: 0,
m1: function() {
//...
},
m2: function() {
//...
}
}
外部可以通過(guò)定義的變量名訪問(wèn),起到了一點(diǎn)點(diǎn)的命名空間作用,但是同樣缺點(diǎn)明顯: 會(huì)暴露所有模塊成員,內(nèi)部狀態(tài)可以被外部改寫。比如,外部代碼可以直接改變內(nèi)_count的值。
立刻執(zhí)行函數(shù)(Immediately-Invoked Function Expression,IIFE) or 匿名閉包
如果你不需要傳參數(shù)或者沒(méi)有一些特殊苛刻的要求的,可以使用立刻執(zhí)行函數(shù),該實(shí)例在內(nèi)存中只會(huì)存在一份copy。
var module1 = (function() {
var _count = 0;
var m1 = function() { //...
};
var m2 = function() { //...
};
return {
m1: m1,
m2: m2
};
})();
這樣可以很好的保護(hù)私有變量,通過(guò)return來(lái)設(shè)置公開(kāi)的方法。缺點(diǎn)也有: 動(dòng)態(tài)添加方法的時(shí)候比較麻煩,且無(wú)法修改內(nèi)部私有變量 .
未完...