变量对象的创建,经历了一下三个过程:

  1. 建立arguments对象。检查当前上下文中的参数,建立该对象下的属性和属性值
  2. 检查当前上下文的函数声明,即用function关键字声明。在变量对象中以函数名建立属性,属性值指向改函数所以在内存地址的引用。
  3. 检查当前上下文的变量声明,在变量对象中以变量名建立属性,属性值为undefined(如果该变量名的属性已经存在,则跳过,原属性值不会被修改)

例子:

1
2
3
4
5
6
7
8
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}

经过变量提升,上面的例子实际变成了:

1
2
3
4
5
6
7
8
9
function test() {
function foo() {
return 2;
}
var a;
console.log(a);
console.log(foo());
a = 1;
}

前端基础进阶(三):变量对象详解