一痴昧、什么模塊模式
在JavaScript中沒有包(Package)的概念鸯隅,而面對(duì)日益龐大的JavaScript代碼痢毒,而這正促使模塊化開發(fā)的迫切需求送矩,所以也就誕生了JavaScript的模塊模式, 最早這么叫的是老道哪替,他稱之為 模塊模式 (Module Patterns).
模塊模式提供了用于創(chuàng)建獨(dú)立解耦的代碼片段的工具栋荸,這些代碼可以被當(dāng)成黑盒,當(dāng)你正在寫的軟件需求發(fā)生變化時(shí)凭舶,這些代碼可以被添加晌块、替換、移除帅霜。
二匆背、匿名閉包
這是一切成為可能的基礎(chǔ),也是JavaScript最好的特性义屏。我們將簡(jiǎn)單的創(chuàng)建匿名函數(shù)靠汁,并立即執(zhí)行蜂大。所有函數(shù)內(nèi)部代碼都在閉包(closure)內(nèi)闽铐。它提供了整個(gè)應(yīng)用生命周期的私有和狀態(tài)。
(function () {
// ... all vars and functions are in this scope only
// still maintains access to all globals
}());
注意匿名函數(shù)周圍的()奶浦。這是語言的要求兄墅。關(guān)鍵字function一般認(rèn)為是函數(shù)聲明,包括()就是函數(shù)表達(dá)式澳叉。
三隙咸、引入全局
JavaScript有個(gè)特性沐悦,稱為隱性全局。使用變量名稱時(shí)五督,解釋器會(huì)從作用域向后尋找變量聲明藏否。如果沒找到,變量會(huì)被假定入全局(以后可以全局調(diào)用)充包。如果會(huì)被分配使用铃肯,在還不存在時(shí)全局創(chuàng)建它瘫筐。這意味著在匿名函數(shù)里使用全局變量很簡(jiǎn)單。不幸的是,這會(huì)導(dǎo)致代碼難以管理雾消,文件中不容易區(qū)分(對(duì)人而言)哪個(gè)變量是全局的。
幸好瘫寝,匿名函數(shù)還有一個(gè)不錯(cuò)的選擇爵政。全局變量作為參數(shù)傳遞給匿名函數(shù)。將它們引入我們的代碼中钢悲,既更清晰点额,又比使用隱性全局更快。下面是一個(gè)例子:
(function ($, YAHOO) {
// 當(dāng)前域有權(quán)限訪問全局jQuery($)和YAHOO
}(jQuery, YAHOO));
四莺琳、模塊出口
有時(shí)你不只想用全局變量咖楣,但你需要先聲明他們(模塊的全局調(diào)用)。我們用匿名函數(shù)的返回值芦昔,很容易輸出他們诱贿。這樣做就完成了基本的模塊模式。以下是一個(gè)完整例子:
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {
// ...
}
my.moduleProperty = 1;
my.moduleMethod = function () {
// ...
};
return my;
}());
注意咕缎,我們聲明了一個(gè)全局模塊MODULE珠十,有兩個(gè)公開屬性:方法MODULE.moduleMethod和屬性MODULE.moduleProperty。而且凭豪,匿名函數(shù)的閉包還維持了私有內(nèi)部狀態(tài)焙蹭。同時(shí)學(xué)會(huì)之上的內(nèi)容,我們就很容易引入需要的全局變量嫂伞,和輸出到全局變量孔厉。