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 高级程序设计》 第三版