新聞資訊

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)軟件(jiàn)工(gōng)程的(de)方法,管理(lǐ)網頁的(de)業(y®è)務邏輯。Javascript模塊化(huà)編程,已經成為(wèi)一(yī)個(gè)迫切的(d e)需求。理(lǐ)想情況下(xià),開(kāi)發者隻需要(yào)實現(xiàn)核心的(de)業(yè)務邏輯,其他(tā)都(dōu)可(kě)以加載别人(rén)已經寫€好(hǎo)的(de)模塊。Javascript社區(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éng)的(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òng)的(de)時(shí)候,直✔接調用(yòng)就(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 Object({

    _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è)對(duì)象的(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,IIF↔E),可(kě)以達到(dào)不(bù)暴露私有(yǒu)成員(yuán)的(de)目的(de)。

  var module1 = (function(){

    var _count = 0;

    var m1 = function(){

      //...

    };

    var m2 = function(){

      //...

    };

    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模塊的(de)基本寫法。下(xià)面,再對(duì)這(zhè)種寫法進δ行(xíng)加工(gōng)。