麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

理解Javascript閉包

2019-11-20 21:48:25
字體:
來源:轉載
供稿:網友

閉包是ECMAScript一個很重要的特征,但是卻很難用合適的定義來描述它。雖然閉包很難清晰地描述,但是,卻很容易創建,或者說,不小心創建。然而,閉包的存在其實是有一定的潛在問題的。為了避免“不小心”地創建閉包,以及更好地利用閉包的優點,有必要理解閉包的機制。

閉包的定義
 
關于閉包,有太多的定義,特別是有一些定義非常抽象,象這個:

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

大致是說閉包是一個表達式,擁有一些自由變量及綁定這些變量的執行環境。這種定義太書面化,反而難以理解。

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

這里不想太多討論函數與閉包的關系,下面給出我認為比較容易理解的定義吧。

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

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

最后,在其上下文環境結束后仍然存在。即內部函數擁有比它的外部函數更長的生命周期。

 
關于閉包定義的解析
 
關于閉包定義的兩點,一直在考慮是不是必須同時滿足。

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

其次,如果函數內部存在free variables,但是當其上下文環境銷毀后,它也跟著銷毀。可以想象內部函數,雖然訪問了其外部函數變量,但是當外部函數執行完后也隨之回收。這種情況下,閉包的討論也沒有意義。

 
來看兩個例子:

復制代碼 代碼如下:

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

        innerFn();
              // 單純的內部函數調用
        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
       // 通過其他閉包改變
    objectB.updateGetLocalB();

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

    objectB.updateLocalB();

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

閉包的優點和缺點

閉包的優點是閉包內部可以訪問到定義它們的外部函數的參數和變量(除了this和arguments)。
閉包主要的問題便是它會保存包含它的函數的作用域,因此比一般函數占用更多的內存空間,因此不宜過度使用閉包。

閉包的應用

閉包最基本的應用場景便是通過保護內部變量從而實現私有,比如模塊模式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久久久久久久 | 美女wc | 欧美一区二区三区免费观看 | 国产老师做www爽爽爽视频 | 欧洲成人综合网 | 国产正在播放 | 九九精品视频免费 | 国产精品久久久久久久久久大牛 | 国产精品亚洲欧美一级在线 | 欧美性猛交一区二区三区精品 | 一级视频在线播放 | 成人三级电影网站 | 一区在线看 | 国产精品av久久久久久网址 | 欧美日韩经典在线 | 亚洲精品成人18久久久久 | 久久精品国产一区二区 | 成人三级视频网站 | 欧美xxxx精品另类 | 最新av免费网址 | 国产精品自在线拍 | 免费观看9x视频网站在线观看 | 国产精品成人av片免费看最爱 | 亚洲午夜一区二区三区 | 色啪综合 | 国产精品久久久久久久模特 | 91精彩视频 | 91真视频 | 日产精品久久久一区二区福利 | 91免费视频版 | 舌头伸进添的我好爽高潮网站 | 国产麻豆久久 | 国产一区二区午夜 | 久久久久久久久成人 | 久久精品一区二区三区四区五区 | av电影在线观看免费 | 国产精品成人久久 | 国产亚洲欧美一区久久久在 | 日本在线视频免费 | 亚洲天堂中文字幕在线观看 | 中文字幕在线日韩 |