最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript利用閉包實現(xiàn)模塊化

 更新時間:2017年01月13日 15:55:44   作者:依然仰望  
本文主要介紹了JavaScript利用閉包實現(xiàn)模塊化的方法。具有一定的參考價值,下面跟著小編一起來看下吧

利用閉包的強(qiáng)大威力,但從表面上看,它們似乎與回調(diào)無關(guān)。下面一起來研究其中最強(qiáng)大的一個:模塊。

function foo() {
 var something = "cool";
 var another = [1, 2, 3];
 function doSomething() {
 console.log( something );
 }
 function doAnother() {
 console.log( another.join( " ! " ) );
 }
}

正如在這段代碼中所看到的,這里并沒有明顯的閉包,只有兩個私有數(shù)據(jù)變量something和another,以及doSomething() 和doAnother() 兩個內(nèi)部函數(shù),它們的詞法作用域(而這就是閉包)也就是foo() 的內(nèi)部作用域。

接下來考慮以下代碼:

function CoolModule() {
 var something = "cool";
 var another = [1, 2, 3];
 function doSomething() {
 alert( something );
 }
 function doAnother() {
 alert( another.join( " ! " ) );
 }
 return {
 doSomething: doSomething,
 doAnother: doAnother
 };
}
var foo = CoolModule();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3

這個模式在JavaScript 中被稱為模塊。最常見的實現(xiàn)模塊模式的方法通常被稱為模塊暴露,這里展示的是其變體。我們仔細(xì)研究一下這些代碼。

首先,CoolModule() 只是一個函數(shù),必須要通過調(diào)用它來創(chuàng)建一個模塊實例。如果不執(zhí)行外部函數(shù),內(nèi)部作用域和閉包都無法被創(chuàng)建。其次,CoolModule() 返回一個用對象字面量語法{ key: value, ... } 來表示的對象。這個返回的對象中含有對內(nèi)部函數(shù)而不是內(nèi)部數(shù)據(jù)變量的引用。我們保持內(nèi)部數(shù)據(jù)變量是隱藏且私有的狀態(tài)??梢詫⑦@個對象類型的返回值看作本質(zhì)上是模塊的公共API。這個對象類型的返回值最終被賦值給外部的變量foo,然后就可以通過它來訪問API 中的屬性方法,比如foo.doSomething()。

從模塊中返回一個實際的對象并不是必須的,也可以直接返回一個內(nèi)部函數(shù)。jQuery 就是一個很好的例子。jQuery 和$ 標(biāo)識符就是jQuery 模塊的公共API,但它們本身都是函數(shù)(由于函數(shù)也是對象,它們本身也可以擁有屬性)。

doSomething() 和doAnother() 函數(shù)具有涵蓋模塊實例內(nèi)部作用域的閉包( 通過調(diào)用CoolModule() 實現(xiàn))。當(dāng)通過返回一個含有屬性引用的對象的方式來將函數(shù)傳遞到詞法作用域外部時,我們已經(jīng)創(chuàng)造了可以觀察和實踐閉包的條件。如果要更簡單的描述,模塊模式需要具備兩個必要條件。

1. 必須有外部的封閉函數(shù),該函數(shù)必須至少被調(diào)用一次(每次調(diào)用都會創(chuàng)建一個新的模塊實例)。

2. 封閉函數(shù)必須返回至少一個內(nèi)部函數(shù),這樣內(nèi)部函數(shù)才能在私有作用域中形成閉包,并且可以訪問或者修改私有的狀態(tài)。

一個具有函數(shù)屬性的對象本身并不是真正的模塊。從方便觀察的角度看,一個從函數(shù)調(diào)用所返回的,只有數(shù)據(jù)屬性而沒有閉包函數(shù)的對象并不是真正的模塊。上一個示例代碼中有一個叫作CoolModule() 的獨立的模塊創(chuàng)建器,可以被調(diào)用任意多次,每次調(diào)用都會創(chuàng)建一個新的模塊實例。當(dāng)只需要一個實例時,可以對這個模式進(jìn)行簡單的改進(jìn)來實現(xiàn)單例模式:

var foo = (function CoolModule() {
 var something = "cool";
 var another = [1, 2, 3];
 function doSomething() {
 alert( something );
 }
 function doAnother() {
 alert( another.join( " ! " ) );
 }
 return {
 doSomething: doSomething,
 doAnother: doAnother
 };
})();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3

立即調(diào)用這個函數(shù)并將返回值直接賦值給單例的模塊實例標(biāo)識符foo。

模塊也是普通的函數(shù),因此可以接受參數(shù):

function CoolModule(id) {
 function identify() {
 console.log( id );
 }
 return {
 identify: identify
 };
}
var foo1 = CoolModule( "foo 1" );
var foo2 = CoolModule( "foo 2" );
foo1.identify(); // "foo 1"
foo2.identify(); // "foo 2"

模塊模式另一個簡單但強(qiáng)大的變化用法是,命名將要作為公共API 返回的對象:

var foo = (function CoolModule(id) {
function change() {
 // 修改公共API
 publicAPI.identify = identify2;
}
function identify1() {
 alert( id );
}
function identify2() {
 alert( id.toUpperCase() );
}
var publicAPI = {
 change: change,
 identify: identify1
};
return publicAPI;
})( "foo module" );
foo.identify(); // foo module
foo.change();
foo.identify(); // FOO MODULE

通過在模塊實例的內(nèi)部保留對公共API 對象的內(nèi)部引用,可以從內(nèi)部對模塊實例進(jìn)行修改,包括添加或刪除方法和屬性,以及修改它們的值。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • 使用webpack/gulp構(gòu)建TypeScript項目的方法示例

    使用webpack/gulp構(gòu)建TypeScript項目的方法示例

    這篇文章主要介紹了使用webpack/gulp構(gòu)建TypeScript項目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaScript模擬實現(xiàn)鍵盤打字效果

    JavaScript模擬實現(xiàn)鍵盤打字效果

    這篇文章主要介紹了JavaScript模擬實現(xiàn)鍵盤打字效果,本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • JavaScript中var與let的區(qū)別

    JavaScript中var與let的區(qū)別

    這篇文章主要介紹了JavaScript中var與let的區(qū)別,var是JavaScript剛出現(xiàn)時就存在的變量聲明關(guān)鍵字,而let作為ES6才出現(xiàn)的變量聲明關(guān)鍵字,無疑兩者之間存在著很大的區(qū)別,下面來看看兩者之間到底存在什么
    2021-12-12
  • JS返回iframe中frameBorder屬性值的方法

    JS返回iframe中frameBorder屬性值的方法

    這篇文章主要介紹了JS返回iframe中frameBorder屬性值的方法,分析了frameBorder屬性的功能及javascript獲取frameBorder屬性值的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • JavaScript一文帶你玩轉(zhuǎn)web表單網(wǎng)頁

    JavaScript一文帶你玩轉(zhuǎn)web表單網(wǎng)頁

    表單通常用來收集網(wǎng)頁訪問者信息,常見的表單比如搜索引擎的搜索框、各網(wǎng)頁應(yīng)用的注冊或者登陸界面等,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-10-10
  • JavaScript canvas實現(xiàn)刮刮樂案例

    JavaScript canvas實現(xiàn)刮刮樂案例

    這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實現(xiàn)刮刮樂案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • JavaScript實現(xiàn)可拖拽的拖動層Div實例

    JavaScript實現(xiàn)可拖拽的拖動層Div實例

    這篇文章主要介紹了JavaScript實現(xiàn)可拖拽的拖動層Div的方法,拖拽頁面中的div塊可實現(xiàn)div塊按照拖動軌跡移動的效果,涉及javascript鼠標(biāo)事件、頁面元素樣式結(jié)合事件函數(shù)動態(tài)操作的相關(guān)技巧,需要的朋友可以參考下
    2015-08-08
  • JS瀏覽器導(dǎo)航欄navigator的一些冷知識

    JS瀏覽器導(dǎo)航欄navigator的一些冷知識

    這篇文章主要為大家介紹了JS導(dǎo)航欄navigator的一些冷知識使用方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • javascript實現(xiàn)二叉樹遍歷的代碼

    javascript實現(xiàn)二叉樹遍歷的代碼

    這篇文章主要介紹了javascript實現(xiàn)二叉樹遍歷的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 通過action傳過來的值在option獲取進(jìn)行驗證的方法

    通過action傳過來的值在option獲取進(jìn)行驗證的方法

    通過action傳過來的值在option獲取進(jìn)行驗證,下面有個不錯的示例,需要的朋友不要錯過
    2013-11-11

最新評論

饶平县| 龙川县| 西吉县| 抚州市| 吉安市| 红安县| 高唐县| 额尔古纳市| 新泰市| 宜良县| 伊宁县| 云安县| 孟州市| 饶河县| 阿巴嘎旗| 旬邑县| 盐源县| 石门县| 吕梁市| 米林县| 盐城市| 大邑县| 慈溪市| 安丘市| 涪陵区| 克山县| 保德县| 太保市| 措美县| 华池县| 新巴尔虎左旗| 延安市| 岳普湖县| 通榆县| 察隅县| 日照市| 铜鼓县| 新营市| 岳西县| 登封市| 中方县|