###从执行上下文环境说起
在JavaScript中,平时不可避免的需要我们声明变量和函数,那么在JS解析器中如何这些变量进行操作的了,一切还得从执行下上文中说起。当我们调用一个函数时,一个新的执行上下文就会被创建,而执行上下文的周期可以分成两个阶段:创建阶段、执行阶段
这里不对建立作用域链和确定this指向展开说,下面主要写变量对象
变量对象(Variable Object)
变量对象的创建过程如下:
- 建立arguments对象
- 检查当前上下文的函数声明(function关键字声明创建的属性)
- 检查var变量声明的创建属性
依据上面的规则可以知道function声明比var声明优先级要高一些,下面举一个例子
function test(){
console.log(foo); //hello
console.log(bar); //undefine
var foo = 'Hello';
console.log(foo); //Hello
var bar = function(){
return 'world';
}
function foo(){
return 'hello';
}
}
test();
这里我们可以依据执行上下文的阶段来将变量对象分为创建阶段和执行阶段:
//创建阶段VO
VO = {
arguments:{...},
foo:<foo reference>, //表示foo的地址引用
bar:undefined //var bar;
}
//执行阶段
AO = {
arguments;{...},
foo:'Hello',
bar:<bar reference>
}
在执行阶段,变量对象(VO)转换为了活动对象(AO),里面的属性都可以访问,然后开始执行阶段的操作.