成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分享JS模塊化寫法

Nino / 2352人閱讀

摘要:模塊化編程,已經(jīng)成為一個迫切的需求。但是,不是一種模塊化編程語言,它不支持類,更遑論模塊了。一原始寫法模塊就是實現(xiàn)特定功能的一組方法。但是,這樣的寫法會暴露所有模塊成員,內(nèi)部狀態(tài)可以被外部改寫。就是模塊的基本寫法。

隨著網(wǎng)站逐漸變成"互聯(lián)網(wǎng)應(yīng)用程序",嵌入網(wǎng)頁的Javascript代碼越來越龐大,越來越復(fù)雜。
網(wǎng)頁越來越像桌面程序,需要一個團(tuán)隊分工協(xié)作、進(jìn)度管理、單元測試等等......開發(fā)者不得不使用軟件工程的方法,管理網(wǎng)頁的業(yè)務(wù)邏輯。
Javascript模塊化編程,已經(jīng)成為一個迫切的需求。理想情況下,開發(fā)者只需要實現(xiàn)核心的業(yè)務(wù)邏輯,其他都可以加載別人已經(jīng)寫好的模塊。
但是,Javascript不是一種模塊化編程語言,它不支持"類"(class),更遑論"模塊"(module)了。(正在制定中的ECMAScript標(biāo)準(zhǔn)第六版,將正式支持"類"和"模塊",但還需要很長時間才能投入實用。)
Javascript社區(qū)做了很多努力,在現(xiàn)有的運行環(huán)境中,實現(xiàn)"模塊"的效果。本文總結(jié)了當(dāng)前"Javascript模塊化編程"的最佳實踐,說明如何投入實用。雖然這不是初級教程,但是只要稍稍了解Javascript的基本語法,就能看懂。

一、原始寫法
模塊就是實現(xiàn)特定功能的一組方法。
只要把不同的函數(shù)(以及記錄狀態(tài)的變量)簡單地放在一起,就算是一個模塊。
  function m1(){
    //...
  }
  function m2(){
    //...
  }
上面的函數(shù)m1()和m2(),組成一個模塊。使用的時候,直接調(diào)用就行了。
這種做法的缺點很明顯:"污染"了全局變量,無法保證不與其他模塊發(fā)生變量名沖突,而且模塊成員之間看不出直接關(guān)系。

二、對象寫法
為了解決上面的缺點,可以把模塊寫成一個對象,所有的模塊成員都放到這個對象里面。
  var module1 = new Object({
    _count : 0,
    m1 : function (){
      //...
    },
    m2 : function (){
      //...
    }
  });
上面的函數(shù)m1()和m2(),都封裝在module1對象里。使用的時候,就是調(diào)用這個對象的屬性。
  module1.m1();
但是,這樣的寫法會暴露所有模塊成員,內(nèi)部狀態(tài)可以被外部改寫。比如,外部代碼可以直接改變內(nèi)部計數(shù)器的值。
  module1._count = 5;

三、立即執(zhí)行函數(shù)寫法
使用"立即執(zhí)行函數(shù)"(Immediately-Invoked Function Expression,IIFE),可以達(dá)到不暴露私有成員的目的。
  var module1 = (function(){
    var _count = 0;
    var m1 = function(){
      //...
    };
    var m2 = function(){
      //...
    };
    return {
      m1 : m1,
      m2 : m2
    };
  })();
使用上面的寫法,外部代碼無法讀取內(nèi)部的_count變量。
  console.info(module1._count); //undefined
module1就是Javascript模塊的基本寫法。下面,再對這種寫法進(jìn)行加工。

四、放大模式
如果一個模塊很大,必須分成幾個部分,或者一個模塊需要繼承另一個模塊,這時就有必要采用"放大模式"(augmentation)。
  var module1 = (function (mod){
    mod.m3 = function () {
      //...
    };
    return mod;
  })(module1);
上面的代碼為module1模塊添加了一個新方法m3(),然后返回新的module1模塊。

五、寬放大模式(Loose augmentation)
在瀏覽器環(huán)境中,模塊的各個部分通常都是從網(wǎng)上獲取的,有時無法知道哪個部分會先加載。如果采用上一節(jié)的寫法,第一個執(zhí)行的部分有可能加載一個不存在空對象,這時就要采用"寬放大模式"。
  var module1 = ( function (mod){
    //...
    return mod;
  })(window.module1 || {});
與"放大模式"相比,"寬放大模式"就是"立即執(zhí)行函數(shù)"的參數(shù)可以是空對象。

六、輸入全局變量
獨立性是模塊的重要特點,模塊內(nèi)部最好不與程序的其他部分直接交互。
為了在模塊內(nèi)部調(diào)用全局變量,必須顯式地將其他變量輸入模塊。
  var module1 = (function ($, YAHOO) {
    //...
  })(jQuery, YAHOO);

上面的module1模塊需要使用jQuery庫和YUI庫,就把這兩個庫(其實是兩個模塊)當(dāng)作參數(shù)輸入module1。這樣做除了保證模塊的獨立性,還使得模塊之間的依賴關(guān)系變得明顯。這方面更多的討論,參見Ben Cherry的著名文章《JavaScript Module Pattern: In-Depth》。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87470.html

相關(guān)文章

  • sea.js的同步魔法

    摘要:寫法加載完后,得到的執(zhí)行結(jié)果作為參數(shù)傳入了回調(diào)函數(shù)寫法預(yù)加載了執(zhí)行模塊,并得到結(jié)果賦值給調(diào)用模塊提供的方法從這一點上來看,兩者在性能上并沒有太多差異。 前些時間也是想寫點關(guān)于CMD模塊規(guī)范的文字,以便幫助自己理解。今天看到一篇知乎回答,算是給了我一點啟發(fā)。 同步寫法卻不阻塞? 先上一個sea.js很經(jīng)典的模塊寫法: // 定義一個模塊 define(function(require, ...

    cloud 評論0 收藏0
  • Javascript ES6學(xué)習(xí)

    摘要:以下簡稱是語言的下一代標(biāo)準(zhǔn)。因為當(dāng)前版本的是在年發(fā)布的,所以又稱。命令用于規(guī)定模塊的對外接口,命令用于輸入其他模塊提供的功能。需要特別注意的是,命令規(guī)定的是對外的接口,必須與模塊內(nèi)部的變量建立一一對應(yīng)關(guān)系。 ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn)。因為當(dāng)前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。 最常用的ES6...

    gclove 評論0 收藏0
  • webpack v2升級踩坑筆記

    摘要:從再到目前當(dāng)紅明星,前端模塊打包技術(shù)日新月異,在今年月份和月份左右接連更新了和版本為了減少冗余模塊,縮減文件大小,中也加入了關(guān)于的特征,可以查看知乎如何評價新引入的代碼優(yōu)化技術(shù)的討論。 從Grunt->gulp->webpack,再到目前當(dāng)紅明星rollup,前端模塊打包技術(shù)日新月異,webpack在今年1月份和6月份左右接連更新了v2和v3版本,為了減少冗余模塊,縮減bundle文件...

    JayChen 評論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(十):面向?qū)ο髮崙?zhàn)之封裝拖拽對象

    摘要:前面幾篇文章,我跟大家分享了的一些基礎(chǔ)知識,這篇文章,將會進(jìn)入第一個實戰(zhàn)環(huán)節(jié)利用前面幾章的所涉及到的知識,封裝一個拖拽對象。不封裝對象直接實現(xiàn)利用原生封裝拖拽對象通過擴(kuò)展來實現(xiàn)拖拽對象。 showImg(https://segmentfault.com/img/remote/1460000008699587); 前面幾篇文章,我跟大家分享了JavaScript的一些基礎(chǔ)知識,這篇文章,...

    Eidesen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<