JavaScript 之變量對象

ps: 若是發現文中有描述不正確的地方,麻煩您必定要在評論區留言告知,謝謝!

前言

在每一個執行上下文中,都包括三個重要的屬性:git

  • 變量對象(Variable Object,VO)
  • 做用域鏈(Scope Chain)
  • this指向

本篇文章主要介紹一下什麼是變量對象。若是不清楚什麼是執行上下文請閱讀《JavaScript 之執行上下文》
Imagegithub

變量對象

變量對象是與執行上下文相關的數據做用域,執行上下文中定義的全部變量和函數都保存在這個對象中。函數

當進入執行上下文時(即執行上下文生命週期中的建立階段),會建立一個變量對象。ui

因爲全局執行上下文和函數執行上下文的變量對象存在一些不一樣點,因此下面對它們分別進行介紹。this

全局執行上下文

在全局執行上下文中,變量對象初始化是全局對象,也就是 window 對象。所以全部聲明的全局變量和函數都是做爲 window 對象的屬性和方法建立的。spa

什麼是全局對象

全局對象是預約義的對象,做爲 JavaScript 的全局函數和全局屬性的佔位符。經過使用全局對象,能夠訪問其餘全部預約義的對象、函數和屬性。

全局對象不是任何對象的屬性,因此它沒有名稱。設計

在頂層 JavaScript 代碼中,能夠用關鍵字 this 引用全局對象。code

由於全局對象是做用域鏈的頭,這意味着在頂層 JavaScript 代碼中聲明的全部變量都將成爲全局對象的屬性。對象

函數執行上下文

在函數執行上下文中,變量對象就是其活動對象(activation object, AO)blog

什麼是活動對象

變量對象和活動對象實際上是一個對象,二者意思相同,只是處於執行上下文的不一樣生命週期。

變量對象是 ECMAScript 規範術語。在一個執行上下文中,變量對象才被激活,變成活動對象。只有激活的變量對象,其各類屬性才能被訪問。在未進入執行上下文以前,變量對象(VO)中的屬性都不能訪問!

變量對象的建立過程

image.png
在進入執行上下文生命週期的建立階段時,會建立一個變量對象,此時代碼還未執行。

  • 檢索當前執行上下文中的全部形參(針對函數執行上下文):該過程生成 Arguments 對象,並建立以形參變量名做爲屬性名,形參變量值做爲屬性值的變量對象屬性;
  • 檢索當前執行上下文中的全部函數聲明:該過程建立以函數名做爲屬性名,函數的引用地址做爲屬性值的變量對象屬性;
  • 檢索當前執行上下文中的全部變量聲明:該過程建立以變量名做爲屬性名,變量值做爲屬性值的變量對象屬性;
function fn(a, b) {
    var c = 2;
    function fn1() {}
    var d = function () {};
}

fn(1, 2);

咱們一塊兒來看下上面這段代碼生成的變量對象是什麼樣子的:

AO = {
    arguments: {
        0: 1,
        1: 2,
        length: 2
    },
    a: 1,
    b: 2,
    c: undefined,
    fn1: reference to function fn1(){},
    d: undefined
}

此時的變量對象是在代碼執行前建立的,在代碼執行階段,會根據代碼修改變量對象的屬性值。

仍是上面的例子,當代碼執行完畢,這時的 AO 變成:

AO = {
    arguments: {
        0: 1,
        1: 2,
        length: 2
    },
    a: 1,
    b: 2,
    c: 2,
    fn1: reference to function fn1(){},
    d: reference to FunctionExpression "d"
}
參考文章和書籍:
JavaScript深刻之變量對象
JavaScript 之深刻理解執行上下文

《JavaScript 高級程序設計》 第三版

相關文章
相關標籤/搜索