javascript 變數物件

karspb發表於2021-09-09

每個執行上下文會包含三個重要屬性,分別是變數物件(Variable Object,VO)作用域鏈(Scope Chain)this 指向

本篇主要詳細介紹變數物件的生成過程。

我們已經知道,在執行上下文的建立階段會生成變數物件,生成變數物件主要有以下三個過程:

  1. 檢索當前上下文中的引數。該過程生成 arguments 物件,建立以形參變數名為屬性名,形參變數值為屬性值的屬性;

  2. 檢索當前上下文中的函式宣告。該過程建立以函式名為屬性名,函式所在記憶體地址引用為屬性值的屬性;

  3. 檢索當前上下文中的變數宣告。該過程建立以變數名為屬性名,undefined 為屬性值的屬性(如果變數名跟已宣告的形參變數名或函式名相同,則該變數宣告不會干擾已經存在的這類屬性)。

我們可以透過以下虛擬碼來表示變數物件

VO={    Arguments:{},    Param_Variable:具體值,  //形參變數
    Function:,
    Variable:undefined
},

當執行上下文進入執行階段後,變數物件會變為活動物件(Active Object,AO)。此時原先宣告的變數會被賦值。變數物件和活動物件都是指同一個物件,只是處於執行上下文的不同階段
我們可以透過以下虛擬碼來表示活動物件

AO={    Arguments:{},    Param_Variable:具體值,  //形參變數
    Function:,
    Variable:具體值
},

舉個例子~
假設有一個 javascript 檔案中包含如下程式碼

function fn1(a) {    var b = 1;    function fn2() {}    var c = function() {};
}

fn1(0);

當 fn1 函式被呼叫時,fn1 執行上下文被建立(建立階段),其變數物件如下所示

fn1Context={
    VO={        Arguments:{            0:0,            length:1
        },        a:0,        b:undefined,        fn2:,
        c:undefined
    }
}

在 fn1 函式上下文的執行階段,變數物件變為活動物件,原先宣告的變數會被賦值,其活動物件如下所示

fn1Context={
    AO={
        Arguments:{
            0:0,
            length:1
        },
        a:0,
        b:1,
        fn2:,
        c:,
    }
}

對於全域性上下文來說,由於其不會有引數傳遞,所以在生成變數物件的過程中只有檢索當前上下文中的函式宣告和檢索當前上下文中的變數宣告兩個步驟。
在全域性上下文中的變數物件(即全域性物件)是我們熟悉的 window,透過該物件可以使用其預定義的變數和函式,在全域性環境中所宣告的變數和函式,也會成為全域性物件的屬性。



作者:淘淘笙悅
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2813738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章