新聞資訊

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)。