JS 预编译

本文深入解析JavaScript预编译过程,包括AO对象创建、形参与变量声明、实参赋值及函数声明的提升。同时,探讨了全局变量与window对象的关系,以及未声明变量如何成为window的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预编译

暗示全局变量

任何变量,如果变量未经声明就赋值,就为全局对象所有(winodw)

	a = 1
	console.log(window.a)
	
	
	function test(){
		 var a = b = 1
		  /*
			var a = b = 1实质上可以分解成
				b = 1----->为window所有
				var a = b---->局部变量,为test所有
		*/
		 console.log(window.a)--->undefined
		 console.log(window.b)--->1
		
	}

window中的变量

一切声明的全局变量,也同时为window所有

	// a是全局变量,归window所有
	var a = 10
	console.log(a)---->等同于console.log(window.a)

预编译过程(发生在函数执行的前一刻)

1.创建AO对象 (Activation Object)
2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3. 将实参值和形参统一
4. 在函数体里面找到函数声明,值赋予函数体

	function fn(a){
		console.log(a)	
		var a  = 123
		console.log(a)	
		function a(){}
		console.log(a)	
		var b = function () {}
		console.log(b)	
		function d() {}
	}
	fn(1)

在调用fn(1)的前一刻,创建了ao,并执行预编译的四个步骤:

1.创建AO对象(全局称为GOGO = window)
	AO{
	}
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
	AO{
		a: undefined;
		b: undefined;
	}
3.将实参值和形参统一
	AO{
		a: 1; --->实参1赋值给a
		b: undefined;
	}
4.在函数体里面找到函数声明,值赋予函数体

	AO{
		a: function a(){};
		b: undefined;
		d: function d(){}
	}
	注意:var b = function(){}不是函数声明
	然后进行函数执行

函数fn执行过程:

	console.log(a) ---> function(){}
	
	var a = 123 ---->等同 a = 123,因为在预编译过程就已经将a提升至顶部并放入AO对象
	
	console.log(a) --->经过上一步,a的值已经从function变成123
	
	function a(){}---->已经提升,忽略
	
	console.log(a) ----> 123
	
	var b = function(){}
	
	console.log(b) ---->function(){}
	

对于GO的说明

1.GO等同于window对象(global object)
2,GO和AO类似,不过它里面还要放未经声明的变量

test(){
	/*
		实质上b是未经声明的,要放在全局作用域的GO里面
		GO{
			b :1;
		}
	*/	
	var a = b = 1
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值