JS函数体内预编译
预编译:
1:创建一个AO对象(Active Object),执行期上下文
2:找形参和变量申明,并把形参和变量声明的名作为AO对象的属性名
3:形参和实参的值相统一
4:在函数体里面找函数声明,赋值于函数体
function Test(a){
console.log(a);
var a = 123;
console.log(a)
function a () {}
console.log(a);
var b = function () {}
console.log(b);
function d() {}
}
Test(1);
/***
** 1:创建一个AO(Active Object)对象,执行期上下文
** AO:{}
**/
/***
** 2:找形参和变量申明,并把形参和变量声明的名作为AO对象的属性名
** 参数a为形参 var a为变量声明 var b为变量声明
** 所以AO对象为:
** AO:{
** a:nudefinde, //此处形参a被变量a覆盖
** b:nudefinde
** }
**/
/***
** 3:形参和实参的值相统一
** AO:{
** a:1,
** b:nudefind
** }
**/
/***
** 4:在函数体里面找函数声明,赋值与函数体
** AO:{
** a:function a() {},
** b:nudefind,
** d:function d() {}
** }
** 至此,AO对象创建完毕,函数执行
**/
//函数执行
/***
** 预编译完成之后函数一行一行的执行
** 执行到第一个console.log(a)时,此时AO里面a=function a(){}, 所以打印function a(){}
** 执行到var a = 123时,此时AO里面的a被赋值 = 123,所以下一个console.log(a) 打印123,
** function a () {} 这一步由于预编译函数提升了(提升忽略) 所以AO里面a没有改变
** 所以下一个console.log(a) 打印123
** var b = function () {} 改变AO里面的b,所以下一个console.log(a) 打印function (){}
** 最后AO的状态为
** AO:{
** a:function a(){}, // a经历了 a:123 => a:function a() {} 命运多舛......
** b:function () {},
** d:function d() {}
** }
***************此时处于蒙B状态*****************
**
***/
配合变量提升一起食用https://blog.youkuaiyun.com/Arminmlc/article/details/104878505