JS函数体内预编译

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值