预编译与作用域链
一、局部作用域(如以下函数)
function fn(a,b){
var a=1;
function a(){};
}
fn(2,3)
1、新建AO对象,创建一个隐式空对象——AO(Activation Object)。
AO{}
2、查找(函数内)形参和变量声明(var),将形参名和变量名作为AO对象的属性,赋值为undefined。
AO{
a:undefined,
b:undefined
}
3、将形参与实参相统一,修改AO对象中形参的属性值,赋值为对应的实参值。
AO{
a:2,
b:3
}
4、查找函数声明(注意不是函数表达式),函数名作为AO对象的属性,函数体作为的值。
AO{
a:function(){},
b:3
}
5、以AO为基础,执行作用域内的函数(提升的忽略)
AO{
a:1,
b:3
}
二、全局作用域
1、新建AO对象,创建一个隐式空对象——GO(Global Object)。
GO{}
2、将全局作用域的变量声明放到GO对象中,并赋值为undefined。
3、按照顺序执行。
三、作用域链
作用域链形式
var c=0;
function a(){
function b(){
}
}
b函数的作用域链为
{
0:bAO{}
1:aAO{}
2:GO{}
}