實現javascript下的模塊組織

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/05/12/6846215.html
-Advertisement-
Play Games

[1]反模式 [2]字面量 [3]IIFE [4]IIFE傳參 [5]命名空間 ...


前面的話

  java有類文件、Python有import關鍵詞、Ruby有require關鍵詞、C#有using關鍵詞、PHP有include和require、CSS有@import關鍵詞,但是對ES5版本的javascript來說,javascript通過script標簽引入代碼的方式顯得雜亂無章,語言自身毫無組織和約束能力,人們不得不用命令空間等方式人為地約束代碼,以求達到安全和易用的目的。本文將詳細介紹javascript中的模塊組織

 

反模式

  反模式(Anti-Pattern)指沒有使用任何模塊系統

  簡單地,把不同的函數(以及記錄狀態的變數)放在一起,就算是一個模塊

  function m1(){
    //...
  }
  function m2(){
    //...
  }

  上面的函數m1()和m2(),組成一個模塊。使用的時候,直接調用就行了。

  這種做法的缺點很明顯:"污染"了全局變數,無法保證不與其他模塊發生變數名衝突,而且模塊成員之間看不出直接關係

 

字面量

  為瞭解決上面的缺點,可以把模塊寫成一個字面量,所有的模塊成員都放到這個對象裡面

  var module1 = new Object({
    _count : 0,
    m1 : function (){
      //...
    },
    m2 : function (){
      //...
    }
  });

  上面的函數m1()和m2(),都封裝在module1對象里。使用的時候,就是調用這個對象的屬性

module1.m1();

  但這種寫法會暴露所有模塊成員,內部狀態可被外部改寫。比如,外部代碼可以直接改變內部計數器的值

module1._count = 5;

 

IIFE

  使用"立即執行函數"(Immediately-Invoked Function Expression,IIFE)可以達到不暴露私有成員的目的

  var module1 = (function(){
    var _count = 0;
    var m1 = function(){
      //...
    };
    var m2 = function(){
      //...
    };
    return {
      m1 : m1,
      m2 : m2
    };
  })();

  使用上面的寫法,外部代碼無法讀取內部的_count變數

console.info(module1._count); //undefined

 

IIFE傳參

  如果一個模塊需要繼承另一個模塊,則需要IIFE傳參

  var module1 = ( function (mod){
    mod.m3 = function () {
      //...
    };
    return mod;
  })(window.module1 || {});

 

命名空間

  如果採用IIFE的方法,隨著模塊的增多,仍然污染了全局環境。

  而命名空間(Namespace)可以通過只暴露類似於一個'namespace'的全局變數,來實現所有模塊的聲明,進而解決全局環境的污染問題

//math.js
namespace('math', [], function(){
  function add(a, b) { return a + b; }
  function sub(a, b) { return a - b; }
  return {
    add: add,
    sub: sub
  }
})

//calculator.js
namespace('calculator', ['math'], function(m){
  var action = 'add';
  function compute(a,b) {
    return m[action](a, b);
  }
  return {
    compute: compute
  }
})
var namespace = (function(){
    //緩存所有模塊
    var cache = {};
    function createModule(name/*模塊名*/,deps/*依賴列表*/,definition/*定義*/){
        //如果只有模塊名,則直接輸出
        if(arguments.length === 1){
            return cache[name];
        }
        //取得所有模塊的依賴
        deps = deps.map(function(depName){
            return namespace(depName); 
        })
        //初始化模塊並返回
        cache[name] = definition.apply(null,deps);

        return cache[name];
    }
    return createModule;
})()

 

最後

  雖然,使用命名空間可以解決全局環境污染的問題,但是卻無法解決模塊依賴管理的問題

  如下圖所示,module2依賴於module1和module3,則代碼如下

<script src="module1.js"></script>
<script src="module3.js"></script>
<script src="module2.js"></script>

  但,如果模塊組織如下所示

  甚至,如下所示

  這時,手動地處理模塊之間的依賴關係就不現實了,需要使用AMD、CMD、ES6 MODULE等來處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了緊跟潮流,本文將向大家介紹一下視頻直播中的基本流程和主要的技術點,包括但不限於前端技術。 1 H5到底能不能做視頻直播? 當然可以, H5火了這麼久,涵蓋了各個方面的技術。 對於視頻錄製,可以使用強大的webRTC(Web Real-Time Communication)是一個支持網頁瀏覽器進行 ...
  • JQuery中操作Css樣式的方法 css操作都有哪幾種??? 1. "css" 2. "位置" 3. "尺寸" css操作中的css!!! css代碼 html代碼 jq代碼 代碼運行的結果 css操作中的位置!!! css代碼 html代碼 jq代碼 代碼運行的結果 css操作中的尺寸!!! c ...
  • 之前一直沒有深入瞭解到clone()函數的方法,所以對應表單中增加和減少輸入項一直使用如: var copy_html=$(選擇器).html(); alert(copy_html); 問題在於得出的copy_html直接是HTML內容代碼,未經過object封裝,而使用: var copy_htm ...
  • 頁面佈局中,我們經常需要用百分比來實現寬度自適應,但是如果這時候高度要跟寬度呈固定比例變化,該怎麼辦呢? ...
  • 前端開發拿數據頁面實時更新是離不開Ajax這個技術的 AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。 ps:非同步的javascript和XML技術,可以在不刷新重載整個網頁情況下更新部分頁面 ...
  • 什麼是Cookie Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。 由於HTTP是一種無狀態的協議,伺服器單從網路連接上無從知道客戶身份。 ...
  • 一、文字排版--字體 我們可以使用css樣式為網頁中的文字設置字體、字型大小、顏色等樣式屬性。 下麵我們來看一個例子,下麵代碼實現:為網頁中的文字設置字體為宋體。 這裡註意不要設置不常用的字體,因為如果用戶本地電腦上如果沒有安裝你設置的字體, 就會顯示瀏覽器預設的字體。(因為用戶是否可以看到你設置的字體 ...
  • 首先導入jQuery.form.js文件,下麵src是相對於改js文件位置, <script type="text/JavaScript" src="jquery/jquery-form.js"></script> <script type="text/javascript">var BYTES_P ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...