预编译

本文介绍了JavaScript中的预编译概念,包括全局预编译和函数执行前的预编译阶段。预编译会创建Global Object和Activation Object,处理变量和函数声明。全局预编译时,全局变量被定义为Go的属性,函数被赋值。函数执行前,形参、变量和函数声明会被处理。预编译结束后,程序执行时变量和函数的赋值会覆盖之前的值。
摘要由CSDN通过智能技术生成

JS三部曲

1.语法分析(扫描)
2.预编译
3.解释执行

预编译不仅仅会发生在代码块执行之前(全局的预编译),它更多的是会发生在函数执行之前。

全局的预编译

1.首先创建一个Go对象(Global Object)
2.浏览寻找全局变量将其作为Go的属性名并赋值undefined
3.寻找函数名并赋值函数体

举个简单的例子

var a = 123;
function a() {}
console.log(a);

a.全局预编译的过程,首先应该先创建一个Go对象

Go{ }

b.寻找全局变量名赋值undefined

Go{
	a:undefined
	}

c.寻找函数名并赋值函数体,这时候Go对象中的a变量的值,就会被覆盖

Go{
	a:function() {}
	}

执行完以上内容,预编译就完成了,此时a变量的值是一个函数,接下来开始执行程序,a被赋值123覆盖以前的值,所以输出的值为123.

预编译不仅会发生在全局还会发生在函数执行前的一刻

过程与全局预编译类似

1.创建Ao对象(Activation Object 也就是执行器上下文)
2.找形参变量声明,将形参名和变量名作为Ao的属性名,赋值undefined
3.将形参和实参相统一
4.找函数体里的函数声明,将函数名作为Ao的属性名,值为函数体

举个例子

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() {}
}

答案:
funciton a() {}
123
123
function () {}

a.根据预编译的过程首先创建一个Ao对象

Ao()

b.找形参和变量声明

Ao{
	a:undefined (首先找到的形参a,然后变量a覆盖形参a,并赋值undefined)
	b: undefined  (这里注意b是一个变量名,而不是形参)
}

c.形实参统一

d.寻找函数声明并赋值

Ao{
	a: function () {}
	b:undefined
	d:function() {}
}

预编译结束开始执行,执行第一个console.log ,a的值为function a() {},然后给a赋值123,覆盖以前的值,所以第二个console.log为123,第三个依然为123,因为中间的函数在预编译的过程中已经执行过了,然后b赋值函数体,所以最后b输出的是一个函数

*总结一句话:函数声明整体提升,变量的声明提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值