對js中執行環境、作用域和作用域鏈的理解

慕斯不想說話發表於2019-04-10

  越是學習js越是覺得js基礎理論知識是多麼的重要,所以最近花了比較多的時間去學習,並把學習所得之感悟記錄下來,以加深自己的理解,同時也供將來自己複習所用。寫的不對的地方還煩請各位大神指出,非常樂意跟各位同道中人交流。

1、執行環境

  執行環境是指函式或變數在js執行起來時所處的環境。執行環境定義了變數或函式有權訪問的其他資料,決定了他們各自的行為,決定了它們的生命週期。執行環境可分為函式執行環境和全域性執行環境。 參考連結:

函式執行環境: 每當呼叫函式時,都會在記憶體中建立該函式的執行環境,函式環境會被推入一個環境棧中。當函式執行完之後,棧將其環境彈出,並將其銷燬,把控制權返回給之前的執行環境。
全域性執行環境: 是最外圍的一個執行環境。在web瀏覽器中,window物件那個被認為是全域性執行環境。所有的全域性變數和函式都是window物件的屬性和方法。全域性執行環境在應用程式退出(網頁/瀏覽器關閉)時被銷燬。

2、作用域

作用域: 表示變數或函式能夠被訪問到的區域。一般分為區域性作用域(函式作用域)和全域性作用域。
作用域鏈: 當程式碼在一個環境中執行時,會建立變數物件的作用域鏈,它的用途是保證對執行環境中有權訪問的所有變數和函式的有序訪問。作用域鏈的本質其實是一個指向變數物件的指標列表,只引用但不實際包含變數物件。作用域的最頂端在瀏覽器環境中是window,在node環境中是global。而作用域的最前端始終是當前執行的程式碼所在環境的變數物件。

3、變數物件

變數物件: 每個執行環境中都會有一個與之關聯的變數物件,它包括執行環境中定義的所有變數和函式。如果執行環境是函式,那麼則將其活動物件作為變數物件。活動物件在最開始時只有一個變數————anguments(在全域性環境中不存在)。作用域鏈中的下一個變數物件那個來自包含環境,這樣一直延續到全域性執行環境中的變數物件。而建立變數物件就是將各種變數和函式進行提升的環節。
活動物件:當前函式執行環境中的變數物件。只是它需要在函式被呼叫時才被啟用,而且初始化arguments。

下面來看一個例子:

    function compare(value1,value2){
        if(value1<value){
            return -1;
        }else if(value1>value2){
            return 1;
        }else{
            return 0;
        }
    }
    var result=compare(5,10)
複製程式碼

下圖展示了上面程式碼的執行環境及作用域鏈及變數物件的關係(截圖於書上,人比較懶)

對js中執行環境、作用域和作用域鏈的理解
  圖片分析:全域性環境的變數物件有兩個——compare和result(根據變數宣告提升,result提升其所在作用域的頂端時還沒初始化,所以為undefined)。在compare()函式執行過程中,會建立一個函式執行環境,執行環境的變數物件由函式內部活動物件和全域性變數物件組成,並建立一個預先包含全域性變數物件的作用域鏈。

相關文章