中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      正確理解Javascript閉包

      時間:2024-06-15 21:46:16 JavaScript 我要投稿
      • 相關推薦

      正確理解Javascript閉包

        正確理解Javascript閉包

        閉包是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)。

        閉包主要的問題便是它會保存包含它的函數的作用域,因此比一般函數占用更多的內存空間,因此不宜過度使用閉包。

        閉包的應用

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

        

      【正確理解Javascript閉包】相關文章:

      javascript的閉包概念怎么理解06-15

      javascript閉包的定義及應用實例分析08-25

      Javascript 閉包引起IE內存泄露分析07-05

      對javascript的理解08-08

      常用的JavaScript模式09-22

      Javascript的this用法簡述08-15

      JavaScript學習筆記08-24

      JavaScript 基礎教學09-29

      JavaScript的課堂講解09-03

      JavaScript常用方法匯總10-25

      主站蜘蛛池模板: 亚洲AV永久无码精品表情包| 久久精品国产亚洲av热明星| 久久久亚洲精品免费视频| 亚洲精品成人网线在线播放va| 富源县| 91色婷婷成人精品亚洲| 国产精品女丝袜白丝袜| 对白刺激的老熟女露脸| 永泰县| 蓬安县| 奉节县| 国产亚洲高清在线精品不卡| 亚洲精品自拍视频在线观看 | 日韩AV无码中文无码AV| 激情人妻网址| 国产在线一区二区三区在线观看 | 景宁| 熟女一区二区三区视频| 欧美人与动牲交片免费播放| 青青手机在线视频观看| a欧美一级爱看视频| 国产在线观看免费一级| 国产白浆美女在线观看| 国产视频一区二区三区四区视频 | 亚洲A∨日韩Av最新在线| 国产精品久久久在线视频| 国产精品一区二区三区蜜臀 | 麻豆国产VA免费精品高清在线| 国产女同一区二区在线| 毛片av中文字幕一区二区| 人妖另类综合视频网站| 国产亚洲精选美女久久久久| 天啦噜国产精品亚洲精品| 午夜免费福利一区二区无码AV| 国产盗摄XXXX视频XXXX| 国产一区二区亚洲一区二区三区| 一区二区三区偷拍系列| 日本熟女五十路一区二区| 亚洲精品久久久蜜桃一区| 精品欧洲AV无码一区二区免费| 爆乳午夜福利视频精品|