1 var num = 100; 2 function fun(num){ 3 console.log(num); 4 } 5 fun(5);
以这段代码为例分析函数的预编译
开始一步步的分析
1.分析GO对象,首先会生成保存全局变量的全局对象。
1.1生成自己的GO对象
GO={}
1.2分析GO对象中的变量声明
GO={
num:undefined
}
1.3分析GO对象中的函数声明
GO={
num:undefined
fun:function
}
2.逐行执行
在第一行产生了赋值:
GO={
num:100
fun:function
}
到第五行函数调用,在调用的函数前的一瞬间生成了一个AO对象
3.生成AO对象
AO={}
3.1分析参数
AO={
num:5
}
3.2分析变量声明 没有略过
3.2分析函数声明 没有略过
最后的AO对象为
AO={
num:5
}
然后开始逐行执行
知识点汇总:
1.函数在执行前的一瞬间,会生成一个AO(active object)对象
2.分析参数,形参作为AO对象的属性名,实参作为AO对象的属性值
3.分析var变量声明,变量名作为AO对象的属性名,值为undefined,如果遇到同名的,不去做任何改变
4.分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名的,直接覆盖