<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 正確理解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

    主站蜘蛛池模板: 精品无码国产一区二区三区51安| 国产精品欧美久久久天天影视| 人妻少妇精品中文字幕av蜜桃| 91精品国产人成网站| 日本aⅴ精品中文字幕| 精品人妻一区二区三区毛片 | 国产微拍精品一区二区| 国产成人精品免费视频动漫| 亚洲国产精品18久久久久久| 欧美精品三区| 国产精品男男视频一区二区三区 | 在线电影国产精品| 国产精品久久国产精品99盘| 久久成人国产精品| 中文字幕精品亚洲无线码一区 | 成人午夜精品久久久久久久小说| 国产精品禁18久久久夂久| 一本大道无码日韩精品影视| 欧美成人精品网站播放| 国产精品视频免费一区二区| 亚洲精品高清国产一久久| 午夜精品福利视频| 九九在线精品视频专区| 99re这里只有精品国产精品| 国精品无码一区二区三区在线 | 中文精品久久久久国产网址| 久久国产亚洲精品无码| 少妇人妻偷人精品免费视频| 国产激情精品一区二区三区| 欧美精品高清在线观看| 精品一区二区久久久久久久网站| 992tv精品视频tv在线观看| 91精品国产9l久久久久| 91精品国产综合久久婷婷| 国产精品高清一区二区三区| 国产亚洲精品a在线无码| 潮喷大喷水系列无码久久精品| 国产精品毛片无遮挡| 国产精品ⅴ无码大片在线看| 99热精品在线| 亚洲精品福利视频|