国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS 執行環境、作用域鏈、活動對象

NicolasHe / 627人閱讀

摘要:下面仔細分析下作用域鏈當某個函數第一次被調用時,就會創建一個執行環境以及相應的作用域鏈,并把作用域鏈賦值給一個特殊的內部屬性。當前執行環境的變量對象始終在作用域鏈的第位。

JS執行環境

執行環境(Execution context,EC)或執行上下文,是JS中一個極為重要的概念

執行環境分為三種(全局執行環境,函數執行環境,evel()執行環境)

js為每一個執行環境關聯了一個變量對象。環境中定義的所有變量和函數都保存在這個對象中
EC的組成

當JavaScript代碼執行的時候,會進入不同的執行環境(執行上下文),這些執行環境會構成了一個執行環境棧(執行上下文棧)(Execution context stack,ECS)。見下圖:

變量對象
變量對象(VO):變量對象即包含變量的對象,除了我們無法訪問它外,和普通對象沒什么區別。變量對象存儲了在上下文中定義的變量和函數聲明
變量對象和活動對象(AO)

活動對象和變量對象其實是一個東西,只是變量對象是規范上的或者說是引擎實現上的,不可在 JavaScript 環境中訪問,只有到當進入一個執行上下文中,這個執行上下文的變量對象才會被激活,所以才叫 activation object

,而只有被激活的變量對象,也就是活動對象上的各種屬性才能被訪問。

活動對象是在進入函數執行環境時刻被創建的,它通過函數的 arguments 屬性初始化。arguments 屬性值是 Arguments 對象。

變量對象和活動對象的關系
未進入執行階段之前,變量對象(VO)中的屬性都不能訪問!但是進入執行階段之后,變量對象(VO)轉變為了活動對象(AO),里面的屬性都能被訪問了,然后開始進行執行階段的操作。

它們其實都是同一個對象,只是處于執行環境的不同生命周期。

    AO 實際上是包含了 VO 的。因為除了 VO 之外,AO 還包含函數的 parameters,以及 arguments 這個特殊對象。也就是說 AO 的確是在進入到執行階段的時候被激活,但是激活的除了 VO 之外,還包括函數執行時傳入的參數和 arguments 這個特殊對象。

   AO = VO + function parameters + arguments

執行環境分析
全局執行環境是最外圍的執行環境,全局執行環境被認為是window對象,因此所有的全局變量和函數都作為window對象的屬性和方法創建的。 
js的執行順序是根據函數的調用來決定的,當一個函數被調用時,該函數環境的變量對象就被壓入一個環境棧中。而在函數執行之后,棧將該函數的變量對象彈出,把控制權交給之前的執行環境變量對象。

eg:

    var scope = "global"; 
      function fn1(){
         return scope; 
      }
      function fn2(){
         return scope;
      }
      fn1();
      fn2();

演示如下:

[[Scope]] 作用域 變量的作用域

變量的作用域就兩種:全局變量和局部變量

    全局作用域:最外層函數定義的變量擁有全局作用域,即對任何內部函數來說,都是可以訪問的:eg:
    
    
    
    
    
          var outerVar = "outer";
          function fn(){
              console.log(outerVar);
      }
          fn();//result:outer
    局部作用域:局部作用域一般只在固定的代碼片段內可訪問到,而對于函數外部是無法訪問的
    
   
   
     function fn(){
         var innerVar = "inner";
      }
      fn();
      console.log(innerVar);// ReferenceError: innerVar is not defined
    注意:函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
    
    
    
    function fn(){
            age = 18;
        }
        fn();
        console.log(age);// 18

再來看一個有趣的現象:

      var scope = "global";
      function fn(){
         console.log(scope);//result:undefined
         var scope = "local";
         console.log(scope);//result:local;
      }
      fn();

分析:第一個輸出居然是undefined,原本以為它會訪問外部的全局變量(scope=”global”),但是并沒有。這可以算是javascript的一個特點,只要函數內定義了一個局部變量,函數在解析的時候都會將這個變量“提前聲明”,他就等價于下面的代碼:

     var scope = "global";
      function fn(){
         var scope;//提前聲明了局部變量
         console.log(scope);//result:undefined
         scope = "local";
         console.log(scope);//result:local;
      }
      fn();
[[Scopr Chain]] 作用域鏈
理解:根據在內部函數可以訪問外部函數變量的這種機制,用鏈式查找決定哪些數據能被內部函數訪問,這就是作用域鏈

上面給出了環境變量。下面仔細分析下作用域鏈

當某個函數第一次被調用時,就會創建一個執行環境(execution context)以及相應的作用域鏈,并把作用域鏈賦值給一個特殊的內部屬性([scope])。然后使用this,arguments(arguments在全局環境中不存在)和其他命名參數的值來初始化函數的活動對象(activation object)。當前執行環境的變量對象始終在作用域鏈的第0位。以上述執行環境分析的小例子為例進行圖解:當第一次調用fn1時。

解析:可以看到fn1活動對象里并沒有scope變量,于是沿著作用域鏈(scope chain)向后尋找,結果在全局變量對象里找到了scope,所以就返回全局變量對象里的scope值。

再分析下面的代碼:

    function outer(){
         var scope = "outer";
         function inner(){
            return scope;
         }
         return inner;
      }
      var fn = outer();
      fn();

總結

說實話,這節真的是很難,現在還是似懂非懂,不知道在學前端的小伙伴你們覺得呢?如果你們覺得這節學會了,可以給我留言,我是真心不懂這節的內容,希望有會的小伙伴可以給我點幫助!謝謝!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113581.html

相關文章

  • 形象化模擬作用域鏈,深入理解js作用域、閉包

    摘要:至此作用域鏈創建完畢。好了,通過深入理解作用域鏈,我們能跟好的理解的運行機制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對我們理解js這們語言。這次想深入的聊下關于js執行的內部機制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當一個函數執行時,js引擎做了哪些事情--那些我們看不見的動作。 關鍵詞: 執行環境 作用域 作用域鏈 變...

    txgcwm 評論0 收藏0
  • [學習筆記] JavaScript 作用域鏈

    摘要:全局執行環境的變量對象始終是作用域鏈中的最后一個變量對象。綜上,每個函數對應一個執行環境,每個執行環境對應一個變量對象,而多個變量對象構成了作用域鏈,如果當前執行環境是函數,那么其活動對象在作用域鏈的前端。 1.幾個概念 先說幾個概念:函數、執行環境、變量對象、作用域鏈、活動對象。這幾個東東之間有什么關系呢,往下看~ 函數 函數大家都知道,我想說的是,js中,在函數內部有兩個特殊...

    ?xiaoxiao, 評論0 收藏0
  • js 執行環境 活動對象 變量對象 作用域鏈的理解

    摘要:因此我們可以說變量對象包含了活動對象,活動對象就是作用域鏈上正在被執行和引用的變量對象。 看一下是知乎大神對于 js 執行環境 活動對象 變量對象 作用域鏈的解釋假設在全局環境下定義了函數pub()和變量pubvar: var pubvar = 1; function pub () { var pravar = 2; return pubvar + pravar; } ale...

    wenyiweb 評論0 收藏0
  • JS 作用域鏈

    摘要:首先,在創建函數時,作用域鏈內就會先填入對象,圖片只例舉了全部變量中的一部分。然后,解釋器進入函數的執行環境,同樣的,首先填入父級的作用域鏈,就是的,包括了對象活動對象。之后再把的活動對象填入到作用域鏈最頂部,這就是的作用域鏈了。 之前學習JS函數部分時,提到了作用域這一節,但是因為使用材料書不同,今天在讀博客的時候發現其實還有一個知識點即作用域鏈,所以來寫一些個人理解和認識加深記憶。...

    darry 評論0 收藏0
  • 關于js閉包

    摘要:在作用域鏈中,外部函數的活動對象始終處于第二位,外部函數的外部函數的活動對象處于第三位,直到作用域鏈終點即全局執行環境。更為重要的是函數在執行完畢后,其他活動對象也不會被銷毀,因為匿名函數的作用域鏈仍然在引用這個活動對象。 原文鏈接----請點這里 ??閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見方式,就是在一個函數內部創建另一個函數。 ??之所以一個內部的函數可以...

    livem 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<