预编译是上下文环境创建之后,js代码执行之前的对js代码的预处理
预编译包含全局预编译和函数预编译
全局预编译全局上下文创建后,会生成VO变量对象,VO首先会寻找变量声明,将var声明的变量作为VO对象的属性名,值为undefined。然后寻找函数声明,将函数名作为VO对象的属性名,函数本身作为对应的属性值。如果函数名和变量名冲突,函数值会覆盖掉变量值。
查找顺序:变量声明 -> 函数声明
console.log(a)
var a = 100
function a (){}
console.log(a)
/*VO:{
a:undefined -> function //先是变量声明值为undefined,然后是函数声明,值是函数本身
}*/
//输出结果:
//function
//100
函数预编译
函数上下文创建后,会生成AO变量对象
预编译过程:
寻找变量声明,变量名作为AO对象的属性名,属性值为undefined寻找形参,形参名作为AO对象的属性名,属性值为undefined实参给形参赋值,对应形参在AO中的属性值变为实参的值寻找函数声明,函数名作为AO对象的属性名,属性值为函数本身如果函数名与变量名冲突,则函数值将变量值覆盖function fn(a,b){
console.log(a)
var a =100
console.log(a)
function a(){}
console.log(b)
}
fn(200, 300);
/* VO:{
a:undefined-> undefined -> 200 ->function
b:undefined ->300
}
输出结果:
ƒ a() {}
100
300
*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)