变量对象 (Variable object)
当进入函数代码的执行上下文时,一个被称为 活跃对象 的对象会被创建且关联到执行上下文,并为活跃对象初始化arguments属性。然后将活跃对象用作变量对象来实例化变量。
详细定义见E262.3 10.1.6
变量对象是一个抽象定义,由ES规范定义、JS宿主实现。JS代码并不能访问到VO。
处理上下文分为两个阶段
-
进入执行上下文
此时按以下顺序填充VO- 填充函数形参,属性名为形参名,值为实参的值。如没有对应传入的参数,则值为undefined。所以函数的参数是执行代码之前就有值的。
- 函数声明,如果VO中有同名的属性,则覆盖替换 。
- 变量声明(var),属性名为变量名,值为undefined。如果VO中已有同名属性,则不影响已有属性。(ps.let定义时如有同名属性,系统会抛Identifier has already been declared错误)
例:
function test(a){
console.log(b); //function b(){...} 在进入EC的时候就初始化了,所以函数提升
function a(){}
function b(){}
function c(){
console.log(123)
}
var c;
console.log(a); //function a(){...} 由于函数声明覆盖替换已有属性
console.log(c); // function c(){...} 由于变量声明不影响已有属性
}
test(1)
- 执行代码
代码按顺序执行,此时代码会修改VO的属性。
例:
function test(){
function a(){}
var a = 10;
console.log(a); //10
}
test()