感谢讶羽大大的分享,想看原文移步讶羽大大的GitHub
变量对象Variable Object
全局对象
在客户端JavaScript中的全局对象就是window对象。
而在全局上下文中声明的变量,可以作为window对象的一个属性。
var a = 1;
console.log(this.a);//1
window对象有一个window属性指向自己。
var a = 1;
console.log(window.a);
this.window.b = 2;
console.log(this.b);
函数上下文中的VO
当进入了函数上下文后,VO就变成了AO。
其实二者是一个东西,只是在存在在函数的不同的生命周期。
当函数执行的时候,可以分成两个阶段:
分析阶段
这个时候还没有开始执行代码。
此时的函数的VO包括:arguments对象、函数声明、变量声明(按顺序来的)。
举个🌰:
function foo(a) {
var b = 2;
function c() {}
var d = function() {};
b = 3;
}
foo(1);
分析阶段的AO是:
AO = {
arguments: {
0: 1,
length: 1
},
a: 1,
b: undefined,
c: reference to function c(){},
d: undefined
}
代码执行阶段
此时的AO是:
AO = {
arguments: {
0: 1,
length: 1
},
a: 1,
b: 3,
c: reference to function c(){},
d: reference to FunctionExpression "d"
}
思考题
分析就从上面两个阶段来:
console.log(foo);
function foo(){
console.log("foo");
}
var foo = 1;
- 就在全局上下文中
- 既然不是函数上下文就没有arguments
- 开始分析阶段:
- 有个函数function foo
- 有个变量foo,但是已经有了同名函数foo,变量影响不了函数
- 执行代码阶段:
- 执行console.log
- 执行foo
- 去外面找foo
- 找到的是foo函数
- 所以打印foo函数