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

理解Javascript閉包

 更新時(shí)間:2013年11月01日 11:09:56   作者:  
閉包是ECMAScript一個(gè)很重要的特征,但是卻很難用合適的定義來(lái)描述它。雖然閉包很難清晰地描述,但是,卻很容易創(chuàng)建,或者說(shuō),不小心創(chuàng)建。然而,閉包的存在其實(shí)是有一定的潛在問(wèn)題的。為了避免“不小心”地創(chuàng)建閉包,以及更好地利用閉包的優(yōu)點(diǎn),有必要理解閉包的機(jī)制

閉包是ECMAScript一個(gè)很重要的特征,但是卻很難用合適的定義來(lái)描述它。雖然閉包很難清晰地描述,但是,卻很容易創(chuàng)建,或者說(shuō),不小心創(chuàng)建。然而,閉包的存在其實(shí)是有一定的潛在問(wèn)題的。為了避免“不小心”地創(chuàng)建閉包,以及更好地利用閉包的優(yōu)點(diǎn),有必要理解閉包的機(jī)制。

閉包的定義
 
關(guān)于閉包,有太多的定義,特別是有一些定義非常抽象,象這個(gè):

A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables.

大致是說(shuō)閉包是一個(gè)表達(dá)式,擁有一些自由變量及綁定這些變量的執(zhí)行環(huán)境。這種定義太書(shū)面化,反而難以理解。

還有另一個(gè)定義:
所有函數(shù)都是閉包。這個(gè)定義給我很大的迷惑,換句話說(shuō),由于Javascript沒(méi)有塊級(jí)作用域,因此閉包一般指的是函數(shù)(想不出除了函數(shù)以外還有哪些方式可以構(gòu)成閉包)。

這里不想太多討論函數(shù)與閉包的關(guān)系,下面給出我認(rèn)為比較容易理解的定義吧。

首先,閉包的存在是基于作用域鏈。由于作用域鏈的機(jī)制,所有函數(shù)(即使全局函數(shù))都能引用上下文執(zhí)行環(huán)境中的變量(即free variables)。

其次,閉包內(nèi)部必須有free variables。順便說(shuō)下兩種變量1. Local variables (bound variables) 2. Non-local variables (free variables)

最后,在其上下文環(huán)境結(jié)束后仍然存在。即內(nèi)部函數(shù)擁有比它的外部函數(shù)更長(zhǎng)的生命周期。

 
關(guān)于閉包定義的解析
 
關(guān)于閉包定義的兩點(diǎn),一直在考慮是不是必須同時(shí)滿足。

首先,如果閉包內(nèi)部沒(méi)有free variables,即是說(shuō)它沒(méi)有訪問(wèn)外部的變量,那么就失去了閉包的意義。(除非通過(guò)其他閉包改變了行為)因此,我認(rèn)為free variables是必要條件。

其次,如果函數(shù)內(nèi)部存在free variables,但是當(dāng)其上下文環(huán)境銷毀后,它也跟著銷毀。可以想象內(nèi)部函數(shù),雖然訪問(wèn)了其外部函數(shù)變量,但是當(dāng)外部函數(shù)執(zhí)行完后也隨之回收。這種情況下,閉包的討論也沒(méi)有意義。

 
來(lái)看兩個(gè)例子:

復(fù)制代碼 代碼如下:

var objectA = (function() {
        var localA = "localA";

        innerFn();
              // 單純的內(nèi)部函數(shù)調(diào)用
        function innerFn() {
            localA = "innerChange";
        }

        return {
            getLocalA : function() {
                return "empty";
            }
        };
    })();

    objectA.getLocalA();

    objectA.getLocalA = function() {
        return localA;
    };

    //console.log(objectA.getLocalA()); //error: localA is not defined

 
    var objectB = (function() {
        var localB = "localB";

        return {
            getLocalB : function() {
                return "empty";
            },

            updateGetLocalB : function() {
                this.getLocalB = function() {
                    return localB;
                };
            },

            updateLocalB : function() {
                localB = "changeLocalB";
            }
        };
    })();

    console.log(objectB.getLocalB()); // empty
       // 通過(guò)其他閉包改變
    objectB.updateGetLocalB();

    console.log(objectB.getLocalB()); // localB

    objectB.updateLocalB();

    console.log(objectB.getLocalB()); // changeLocalB

閉包的優(yōu)點(diǎn)和缺點(diǎn)

閉包的優(yōu)點(diǎn)是閉包內(nèi)部可以訪問(wèn)到定義它們的外部函數(shù)的參數(shù)和變量(除了this和arguments)。
閉包主要的問(wèn)題便是它會(huì)保存包含它的函數(shù)的作用域,因此比一般函數(shù)占用更多的內(nèi)存空間,因此不宜過(guò)度使用閉包。

閉包的應(yīng)用

閉包最基本的應(yīng)用場(chǎng)景便是通過(guò)保護(hù)內(nèi)部變量從而實(shí)現(xiàn)私有,比如模塊模式。

相關(guān)文章

  • json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例

    json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例

    這篇文章主要介紹了json字符串對(duì)象轉(zhuǎn)換代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • js 剪切板應(yīng)用clipboardData詳細(xì)解析

    js 剪切板應(yīng)用clipboardData詳細(xì)解析

    本篇文章主要介紹了js剪切板應(yīng)用clipboardData。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • JavaScript實(shí)現(xiàn)雪花飄落效果

    JavaScript實(shí)現(xiàn)雪花飄落效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)雪花飄落效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 微信小程序開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)(推薦)

    微信小程序開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)(推薦)

    本篇文章主要介紹了微信小程序開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)(推薦),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 關(guān)于layer.js使用心得-向彈出框傳值問(wèn)題

    關(guān)于layer.js使用心得-向彈出框傳值問(wèn)題

    這篇文章主要介紹了關(guān)于layer.js使用心得-向彈出框傳值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • NodeJS的Promise的用法解析

    NodeJS的Promise的用法解析

    下面小編就為大家?guī)?lái)一篇NodeJS的Promise的用法解析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考
    2016-05-05
  • JavaScript Dom實(shí)現(xiàn)輪播圖原理和實(shí)例

    JavaScript Dom實(shí)現(xiàn)輪播圖原理和實(shí)例

    這篇文章主要為大家詳細(xì)介紹了JavaScript Dom實(shí)現(xiàn)輪播圖原理和實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • js html實(shí)現(xiàn)計(jì)算器功能

    js html實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了js html實(shí)現(xiàn)計(jì)算器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Chart.js與ECharts.js圖表使用過(guò)程組件對(duì)比

    Chart.js與ECharts.js圖表使用過(guò)程組件對(duì)比

    chartjs只能基于canvas,雖然只有英文文檔,但定制化程度更高,社區(qū)成熟,功能就更加穩(wěn)定,ECharts.js可以基于svg或者canvas去渲染,有融合主流前端框架的社區(qū)庫(kù),另外ECharts.js還支持3d效果的圖表,相當(dāng)炫酷,國(guó)內(nèi)開(kāi)發(fā)者大多數(shù)使用這個(gè),有中文文檔
    2023-10-10
  • js匿名函數(shù)的調(diào)用示例(形式多種多樣)

    js匿名函數(shù)的調(diào)用示例(形式多種多樣)

    匿名函數(shù)就是沒(méi)有實(shí)際名字的函數(shù),javaScript的匿名函數(shù)形式多樣,下面就一一為大家羅列出來(lái)
    2014-08-08

最新評(píng)論

丹凤县| 龙岩市| 通道| 永仁县| 凤冈县| 墨竹工卡县| 永顺县| 灵丘县| 张家川| 开江县| 莱州市| 岳阳县| 衡阳市| 星子县| 乐平市| 富锦市| 丰顺县| 敖汉旗| 平和县| 库尔勒市| 溆浦县| 韩城市| 集安市| 郑州市| 万荣县| 贵州省| 衡南县| 塘沽区| 农安县| 盐山县| 容城县| 息烽县| 乳源| 石阡县| 姜堰市| 瑞昌市| 桐城市| 德州市| 西乌珠穆沁旗| 田林县| 阳城县|