JS 执行上下文之变量对象

avatar
Ctrl+C、V工程师 @豌豆公主

这一篇是基于执行上下文栈中的执行上下文继续深入。一般来说,执行上下文中有三个重要属性:

  • 变量对象( VO, Variable Object )
  • 作用域链( Scope Chain )
  • this

什么是变量对象(VO)

变量对象指的是与执行上下文相关的作用域,其中存储了当前执行上下文中定义的变量以及函数声明

变量对象的类型

变量对象的类型主要分两种:全局对象活动对象

全局对象

介绍全局对象需要先解释全局上下文(全局执行环境),全局上下文中的变量主要分为两类:

  • 全局定义的变量
  • 全局上下文中的函数声明

全局变量一般指的是,在全局定义的变量,比如:var xxx = null。我们常用的 Math 其实就是在全局上下文中的函数声明,所以一般说全局对象指的是window对象

全局变量和全局函数都是作为window对象的属性和方法被创建的。

活动对象

活动对象我们又称为AO(activation object),一般是在函数上下文中产生

  • AO 一开始只有一个变量 arguments .
  • AO 是在函数上下文中被创建,所以在全局上下文中是不存在

执行上下文

我们可以简单的认为,执行上下文分两个阶段,第一个是声明阶段,第二个阶段是执行阶段

  • 声明阶段会声明各种变量,以及函数,也包括函数中的形参
  • 执行阶段,修改各个变量的值

声明阶段

在这个阶段中,AO 会收集所有的形参,变量声明,函数声明。

举个例子🌰 :

function changeColor(color) {
  var anotherColor = '#ea4141';
  function outPut() {}
  var _outPut = function () {}
}
changeColor('#cccccc');

在这段代码中,AO 如下:

AO = {
  arguments:{
    0: '#cccccc',
    length: 1
  },
  color: '#cccccc',
  anotherColor: undefined,
  outPut: reference to function outPut(){},
  _outPut: undefined,
}

执行阶段

执行阶段主要是修改 AO 中的变量

AO = {
  arguments:{
    0: '#cccccc',
    length: 1
  },
  color: '#cccccc',
  anotherColor: '#ea4141',
  outPut: reference to function outPut(){},
  _outPut: reference to FunctionExpression "_outPut",
}

总结

  1. 变量对象一般分为两种:全局对象 与 活动对象。
  2. 全局变量与全局中的函数都被作为 window 属性和方法创建。
  3. AO 初始化的时候只有一个 arguments 对象。
  4. 执行上下文中,声明阶段收集各种变量与函数,执行阶段修改值。