JS预编译过程详解

JS预编译

函数的预编译总是发生在函数执行的前一刻

  • 前奏
  1. 一切声明的全局变量都是window的属性;
    eg
var num = 1;
console.log(window.num); // --> 1;
  1. imply global 暗示全局变量 : 任何一个变量未经声明就赋值,此变量为全局对象所有 ——> 即为window的属性;
    eg:
function test() {
	var a = b = 1;
	console.log(a, b);
}
test(); // --> 1 1;
console.log(b); //--> 1;未经声明就赋值,就成为全局变量 打印 1
console.log(a); //--> 报错; a是全局没有,只在test内,作用域问题,下节将;
  • 函数预编译过程
  1. 创建一个AO对象 --> AO:执行期上下文 Activation Object
  2. 找形参和变量声明,将变量名和形参名作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
  3. 将形参和实参统一(将实参值赋给AO中与形参相同的属性);
  4. 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
    eg
function test(a, b){
	var b = 10;
	function a(){
		console.log(a);
	}
	console.log(a, b);
}
test(1, 2);
/*    预编译过程
1. 创建一个AO对象  ==>  AO = {};
2. 找形参和变量声明  ==>  AO = {
						a : undefined,
						b : undefined
					}
3. 将形参和实参统一  ==>   AO = {
						a : 1,
						b : 2
					}
4. 找函数声明,赋值为函数体  ==>  AO = {
								a : function a(){
										console.log(a);
									},
								b : 2
							}
*/
//当预编译执行完:AO为第四步的AO 此时执行函数内部语句:b = 10; ==>  AO{
//													a : function a(){
//														console.log(a);
//													},
//													b : 10	
//												}
//a的函数声明在预编译时执行过了  不看
//执行console.log(a, b) ==>  function(){} 10
ps:js函数执行时查找变量的值都在自己的AO(Activation Object)中找如果没有会去GO(Global Object 下面讲)中找.
  • 全局预编译过程
  1. 创建一个GO对象 --> Global Object
  2. 找变量声明作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
  3. 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
ps : GO === window

AO GO关系:AO里没有去GO找,
GO没有那就没有了;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值