<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript模塊化思想

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:31:42
        文檔

        JavaScript模塊化思想

        JavaScript模塊化思想:對JS學(xué)習(xí)和使用的深入,漸漸的發(fā)現(xiàn)兩個問題: (1)我之前寫的JS代碼重用性很低 (2)功能分散,舉個栗子,我要獲取當(dāng)前日期,也要獲取當(dāng)前日期加1也就是明天的日期,之前我作為兩個獨(dú)立互不相干的函數(shù)去寫,但現(xiàn)在想想,其實(shí)他們都可以歸為一個日期對象的兩
        推薦度:
        導(dǎo)讀JavaScript模塊化思想:對JS學(xué)習(xí)和使用的深入,漸漸的發(fā)現(xiàn)兩個問題: (1)我之前寫的JS代碼重用性很低 (2)功能分散,舉個栗子,我要獲取當(dāng)前日期,也要獲取當(dāng)前日期加1也就是明天的日期,之前我作為兩個獨(dú)立互不相干的函數(shù)去寫,但現(xiàn)在想想,其實(shí)他們都可以歸為一個日期對象的兩

        對JS學(xué)習(xí)和使用的深入,漸漸的發(fā)現(xiàn)兩個問題:

        (1)我之前寫的JS代碼重用性很低

        (2)功能分散,舉個栗子,我要獲取當(dāng)前日期,也要獲取當(dāng)前日期加1也就是明天的日期,之前我作為兩個獨(dú)立互不相干的函數(shù)去寫,但現(xiàn)在想想,其實(shí)他們都可以歸為一個日期對象的兩個方法,把它們綁定在一個對象上,作為它的兩個方法,不是更好么?

        1. 首先,我們需要明白為什么要用模塊化?

        功能都是為了解決需求的。模塊化可以帶來的優(yōu)點(diǎn)有以下幾點(diǎn):

        (1)可維護(hù)性。舉個例子,如果我們把未使用模塊化的代碼比作油和水混合在了一起,模塊化之后的代碼就好像油和水的分層,油就是油,水就是水,這樣的代碼層次清晰,功能分明。似乎用油和水必然分層的現(xiàn)象來指代JS模塊化的大勢所趨也很合適。

        (2)命名空間。這里需要談到JS的作用域。又涉及到了作用域鏈。如果對作用域鏈不熟悉的同學(xué)可以移步我的另一篇文章“理解JavaScript中的作用域鏈”。JS中是靠函數(shù)來區(qū)分作用域的。每個函數(shù)都有一個作用域鏈。如果我們把所有的代碼都揉到一起,代碼行數(shù)少還行,多了就難免會造成“命名空間污染”。

        (3)可復(fù)用性。當(dāng)我們明白了命名空間,借助命名空間我們就可以實(shí)現(xiàn)對模塊代碼的封裝,這樣我們就可以在任何我們需要這個功能的時候直接去引用這個功能模塊。

        接下來,用我的JS代碼之路演示一下如何使代碼模塊化:

        (1)原始時代:把所有的要用到的JS代碼都堆砌在該頁面的一對

        這樣寫的缺點(diǎn):代碼基本沒有什么復(fù)用性可以,應(yīng)該還會存在和頁面隅合度太高的問題。還需要去考慮各種作用域的問題。

        (2)古時代:思路就是把模塊寫成一個對象。比如我們要寫一個能控制頁面音樂播放,停止,下一首,上一首的功能。就可以封裝一個musicPlayer對象

        // 將基本的方法封裝起來
         var musicPlayer = {
        
         var musicDom = null, //播放器對象
         var musicList = [], //存放歌曲列表
        
         // 初始化音樂播放器
         var init = function(){
         
         },
        
         // 添加一首歌曲
         var add = function(src){
         
         },
        
         // 根據(jù)數(shù)組下標(biāo)決定播放哪一首,索引index從0開始
         var play = function(index){
         
         },
        
         // 暫停播放
         var stop = function(){
         
         },
        
         // 下一首
         var next = function(){
        
         },
        
         // 上一首
         var prev = function(){
        
         }
         };

        這時候,就已經(jīng)可以稱之為一個模塊了,在全局作用域中,我們只向window對象上綁定了一個musicPlayer對象,之后我們就可以使用musicPlayer加'.'的形式來調(diào)用里面的方法。如“musicPlayer.init();”

        這種方式也有一個缺點(diǎn),就是我們不能去控制我們想暴露的內(nèi)容,并且在外部可以改寫musicPlayer對象的內(nèi)部方法和變量。

        (3)現(xiàn)代。包含IIFE(立即執(zhí)行函數(shù)),放大模式,寬放大模式,輸入全局變量

          

          除了IIFE,其他的三種我之前都沒有接觸過,在這里簡單談?wù)勎业睦斫狻?/p>

        - IIFE(Immediately-Invoked Function Expression)

        // 創(chuàng)建一個立即執(zhí)行的匿名函數(shù)
        // 該函數(shù)返回一個對象,包含你要暴露的屬性
        // 如下代碼如果不使用立即執(zhí)行函數(shù),就會多一個屬性i
        // 如果有了屬性i,我們就能調(diào)用counter.i改變i的值
        // 對我們來說這種不確定的因素越少越好
        
        var counter = (function(){
         var i = 0;
        
         return {
         get: function(){
         return i;
         },
         set: function( val ){
         i = val;
         },
         increment: function() {
         return ++i;
         }
         };
        }());
        
        // counter其實(shí)是一個對象
        
        counter.get(); // 0
        counter.set( 3 );
        counter.increment(); // 4
        counter.increment(); // 5
        
        counter.i; // undefined i并不是counter的屬性
        i; // ReferenceError: i is not defined (函數(shù)內(nèi)部的是局部變量)

        從以上的代碼可以看出,counter中其中并沒有i這個屬性,它只有return 中暴露出來的內(nèi)容。這樣我們就對i實(shí)現(xiàn)了私有。

        - 放大模式

        我對放大模式的理解就是把原函數(shù)當(dāng)作參數(shù)傳遞到IIFE中,然后給原函數(shù)添加新的擴(kuò)展方法,把擴(kuò)展后的函數(shù)返回。就實(shí)現(xiàn)了對原函數(shù)的“放大”。

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

        在這個例子中,就給module1添加了一個新的方法m3并返回。

        - 寬放大模式

        寬放大模式就是在放大模式的基礎(chǔ)上新增了一個特性:IIFE的參數(shù)可以是空對象。

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

        IIFE傳入的參數(shù):如果window.module1有定義,就傳入該參數(shù),如果為undefined就傳入一個空對象。

        - 輸入全局變量

        如果我們要在IIFE內(nèi)使用全局變量,最好把全局變量通過參數(shù)傳遞進(jìn)去。

         var module1 = (function ($, YAHOO) {
          //...
         })(jQuery, YAHOO);

        如上所示的代碼將jQuery和YUI兩個庫的全局變量當(dāng)作參數(shù)傳入了module1。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript模塊化思想

        JavaScript模塊化思想:對JS學(xué)習(xí)和使用的深入,漸漸的發(fā)現(xiàn)兩個問題: (1)我之前寫的JS代碼重用性很低 (2)功能分散,舉個栗子,我要獲取當(dāng)前日期,也要獲取當(dāng)前日期加1也就是明天的日期,之前我作為兩個獨(dú)立互不相干的函數(shù)去寫,但現(xiàn)在想想,其實(shí)他們都可以歸為一個日期對象的兩
        推薦度:
        標(biāo)簽: 思想 js javascript
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本媚薬痉挛在线观看免费| 69式互添免费视频| 免费a级毛片大学生免费观看| 亚洲日本香蕉视频| 91精品免费高清在线| 亚洲午夜精品一区二区| 午夜精品一区二区三区免费视频| 亚洲乱码国产一区三区| 曰批全过程免费视频在线观看无码| 亚洲欧洲无码AV电影在线观看| 最近免费字幕中文大全| 亚洲女久久久噜噜噜熟女| 日本一区二区免费看| 亚洲av日韩av无码| 亚欧人成精品免费观看| 亚洲一区二区影视| 曰皮全部过程视频免费国产30分钟| 亚洲精品无码av片| 亚洲精品456播放| 在线观看免费黄色网址| 老司机亚洲精品影院| 我的小后妈韩剧在线看免费高清版 | 免费无码H肉动漫在线观看麻豆| 久久久久亚洲AV成人网人人网站| 国产免费无码一区二区| 亚洲国产精品成人久久久| 午夜高清免费在线观看| 在线播放国产不卡免费视频| 亚洲热妇无码AV在线播放| 97免费人妻无码视频| 美女扒开尿口给男人爽免费视频| 国产亚洲?V无码?V男人的天堂| 91香蕉在线观看免费高清| 亚洲一区二区三区丝袜| 亚洲国产婷婷六月丁香| 成人免费大片免费观看网站| 色屁屁www影院免费观看视频| 亚洲色爱图小说专区| 免费可以看黄的视频s色| 成年网站免费入口在线观看| 久久久久亚洲AV片无码下载蜜桃|