你的浏览器不支持canvas

Enjoy life!

javascript - 变量对象和活动对象

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

一、变量对象(Variable Object)

1.1 什么是变量对象

  • 变量对象(Variable Object)是一个 与执行上下文相关 的特殊对象,它存储着在 上下文中声明 的以下内容:
    • 变量 — var xxx,变量声明
    • 函数声明(Function Declaration)—- function xxx () {}
    • 函数的形参(arguments) —- function xxx (a){}a就是形参

1.2 变量对象的创建步骤

  • 请看下图

relationship-map

具体步骤

  1. 检查函数的所有 形参arguments)。
    • 检查当前上下文中的参数,建立该对象下的属性与属性值。
  2. 检查当前上下文的 函数声明 ,就是使用 function 关键字声明的函数。
    • 在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。
    • 如果变量对象已经存在相同名称的属性,则完全替换这个属性。
  3. 检查当前上下文中的 变量声明
    • 每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为 undefined
    • 如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性

1.3 变量对象创建实例

  • 代码如下:
 function test(a, b) {
    console.log(foo); // function
    console.log(bar); // undefined

    var foo = 'Hello';

    console.log(foo); //Hello

    var bar = function () {
        return 'world';
    };

    function foo() {
        return 'hello';
    }
}

test(10);
  • 变量对象创建过程

relationship-map

  • 上述代码的最终执行顺序:

relationship-map

二、活动对象(Activation Object)

  • 活动对象其实就是变量对象。
  • 函数环境中,在 执行上下文创建阶段VO ,到了 执行上下文的执行阶段VO 会转换成 AO(活动对象)。
  • VOAO 是同一个对象,只是处于执行上下文的不同生命周期。

补充:全局环境下只存在变量对象 VO


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。