• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. 正確理解Javascript閉包

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

        正確理解Javascript閉包

          正確理解Javascript閉包

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

          閉包的定義

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

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

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

          還有另一個定義:

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

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

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

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

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

          關(guān)于閉包定義的解析

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

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

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

          來看兩個例子:

          復(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

          // 通過其他閉包改變

          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)部可以訪問到定義它們的外部函數(shù)的參數(shù)和變量(除了this和arguments)。

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

          閉包的應(yīng)用

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

          

        《&.doc》
        将本文的Word文档下载到电脑,方便收藏和打印
        推荐度:
        点击下载文档

        【正確理解Javascript閉包】相關(guān)文章:

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

        javascript閉包的定義及應(yīng)用實(shí)例分析08-25

        Javascript 閉包引起IE內(nèi)存泄露分析07-05

        對javascript的理解08-08

        常用的JavaScript模式09-22

        Javascript的this用法簡述08-15

        JavaScript學(xué)習(xí)筆記08-24

        JavaScript 基礎(chǔ)教學(xué)09-29

        JavaScript的課堂講解09-03

        JavaScript常用方法匯總10-25

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲熟女少妇精品 | 亚洲变态另类天堂AV手机版 | 亚洲国产精品综合色区 | 中日韩欧美综合一区二区三区 | 亚洲国产精品久久久久久网站 | 网址你懂的免费在线观看 |

            正確理解Javascript閉包

              正確理解Javascript閉包

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

              閉包的定義

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

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

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

              還有另一個定義:

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

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

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

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

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

              關(guān)于閉包定義的解析

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

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

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

              來看兩個例子:

              復(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

              // 通過其他閉包改變

              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)部可以訪問到定義它們的外部函數(shù)的參數(shù)和變量(除了this和arguments)。

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

              閉包的應(yīng)用

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