AMD規範及require.js用(yòng)法(✘£Javascript模塊化(huà)編程)
網頁越來(lái)越像桌面程序,需要(yào)一(yī←≥ε)個(gè)團隊分(fēn)工(gōng)協作(zuò)、γ≠♠進度管理(lǐ)、單元測試等等......<開(kāi)發者不(bù)得(de)不(bù)使用(yòng)軟件(j'iàn)工(gōng)程的(de)方法,管理(lǐ)網頁的(de)業(yè&₽•§)務邏輯。Javascript模塊化(huà)編程,已經成為←∑γ(wèi)一(yī)個(gè)迫切的(de)需求。理(lǐ•β≈₽)想情況下(xià),開(kāi)發者隻需要(yào)實現(xiàn)核γδ¶心的(de)業(yè)務邏輯,其他(tā)都(dōu)™∞×Ω可(kě)以加載别人(rén)已經寫好(hǎo)的(de)模塊。J∏↕ "avascript社區(qū)做(zuò)了(le)很(hěn)多(↕♥±×duō)努力,在現(xiàn)有(yǒu✘φ)的(de)運行(xíng)環境中,實現★₽≤(xiàn)"模塊"的(de)效果。本文(wén)總結↓¥∞α了(le)當前"Javascript模塊化(huà)編程↑"的(de)最佳實踐,說(shuō)明(míng)如(rú)何投入實Ω←♦用(yòng)。雖然這(zhè)不(bù)→≠是(shì)初級教程,但(dàn)是(shì)隻要(yào)稍稍了(le)±₹™β解Javascript的(de)基本語法,就(jiù)能(n≥☆éng)看(kàn)懂(dǒng)。
一(yī)、原始寫法
模塊就(jiù)是(shì)實現(xiàn)特定功能(nén•™↑g)的(de)一(yī)組方法。
隻要(yào)把不(bù)同的(de)函數(shù)(以及記錄狀态的(de♦×∏)變量)簡單地(dì)放(fàng)在一(yī)起,就(jiù)算γ₹£(suàn)是(shì)一(yī)個(gè)模塊。
function m1(){
//...
}
function m2(){
//...
}
上(shàng)面的(de)函數(shù)m1()和(h≤↑<é)m2(),組成一(yī)個(gè)模塊。使用(yòn•¶¥¶g)的(de)時(shí)候,直接調用(yòn÷¥<±g)就(jiù)行(xíng)了(le)。
這(zhè)種做(zuò)法的(de)缺點很(hěn)明( ε∏míng)顯:"污染"了(le)全¶♦↕局變量,無法保證不(bù)與其他(tā)模塊發生(shēng)變量名沖突,而且→™★模塊成員(yuán)之間(jiān)看(kàn)不(bù)'≤ ≠出直接關系。
二、對(duì)象寫法
為(wèi)了(le)解決上(shàng)面的(de)缺×∏•點,可(kě)以把模塊寫成一(yī)個(gè)對(duì)象,所有≈★∞(yǒu)的(de)模塊成員(yuán)都(dōu)放(fàng)到(dào±↔)這(zhè)個(gè)對(duì)象裡(lǐ)面。
var module1 = new ObΩ×ject({
_count : 0,
m1 : function (){
//...
},
m2 : function (){
//...
}
});
上(shàng)面的(de)函數(shù)m1()和(hé)→☆m2(),都(dōu)封裝在module1對(duì)象裡(lǐ)。使用™λ¶(yòng)的(de)時(shí)候,就(jiù)是(shì ")調用(yòng)這(zhè)個(gè)對(d•λuì)象的(de)屬性。
module1.m1();
但(dàn)是(shì),這(zhè)樣的(☆→™de)寫法會(huì)暴露所有(yǒu)模塊成員(yuáεβn),內(nèi)部狀态可(kě)以被外(wài)部改寫。比如÷> ₩(rú),外(wài)部代碼可(kě)以<$←₩直接改變內(nèi)部計(jì)數(shù)器(qì)的(de)值。
module1._count = 5;
三、立即執行(xíng)函數(shù)寫法
使用(yòng)"立即執行(xíng)函數(♥§shù)"(Immediately-Invoked Ω≈¶Function Expression,IIFE),可(kě)以達到§(dào)不(bù)暴露私有(yǒu)成員(yuán)的(de)目的(de)。₩↑≠₽
var module1 = (functio>®n(){
var _count = 0;
var m1 = function(¶÷){
//...
};
var m2 = functioφ÷"n(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
使用(yòng)上(shàng)面的(de)寫法,外(wài)部代碼無 ☆♥☆法讀(dú)取內(nèi)部的(de)_count變量。Ω€
console.info(module1.≠×≤↕_count); //undefined©☆§≈
module1就(jiù)是(shì)Javascript模塊的(d♠∑¥e)基本寫法。下(xià)面,再對(duì)這(zhè)種寫βπ☆₽法進行(xíng)加工(gōng)。