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

相关文章
相关标签/搜索