ps: 若是發現文中有描述不正確的地方,麻煩您必定要在評論區留言告知,謝謝!
在每一個執行上下文中,都包括三個重要的屬性:git
本篇文章主要介紹一下什麼是變量對象。若是不清楚什麼是執行上下文請閱讀《JavaScript 之執行上下文》
github
變量對象是與執行上下文相關的數據做用域,執行上下文中定義的全部變量和函數都保存在這個對象中。函數
當進入執行上下文時(即執行上下文生命週期中的建立階段),會建立一個變量對象。ui
因爲全局執行上下文和函數執行上下文的變量對象存在一些不一樣點,因此下面對它們分別進行介紹。this
在全局執行上下文中,變量對象初始化是全局對象,也就是 window 對象。所以全部聲明的全局變量和函數都是做爲 window 對象的屬性和方法建立的。spa
全局對象是預約義的對象,做爲 JavaScript 的全局函數和全局屬性的佔位符。經過使用全局對象,能夠訪問其餘全部預約義的對象、函數和屬性。全局對象不是任何對象的屬性,因此它沒有名稱。設計
在頂層 JavaScript 代碼中,能夠用關鍵字 this 引用全局對象。code
由於全局對象是做用域鏈的頭,這意味着在頂層 JavaScript 代碼中聲明的全部變量都將成爲全局對象的屬性。對象
在函數執行上下文中,變量對象就是其活動對象(activation object, AO)。blog
變量對象和活動對象實際上是一個對象,二者意思相同,只是處於執行上下文的不一樣生命週期。
變量對象是 ECMAScript 規範術語。在一個執行上下文中,變量對象才被激活,變成活動對象。只有激活的變量對象,其各類屬性才能被訪問。在未進入執行上下文以前,變量對象(VO)中的屬性都不能訪問!
在進入執行上下文生命週期的建立階段時,會建立一個變量對象,此時代碼還未執行。
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 高級程序設計》 第三版