js 预编译 GO与AO 变量和函数声明提升

预编译

预编译分为全局(GO)预编译和局部(AO)预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。

js运行三步曲

首先JavaScript的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。

1 语法分析
2 预编译
3 解释执行

局部预编译(AO)的4个步骤
  1. 在执行的前一刻会创建一个ao对象
  2. 将函数内所有的形参和变量声明储存到ao对象中,value为undefined;
  3. 将形参和实参进行统一。
  4. 将所有的函数声明的函数名作为ao对象中的key,函数整体内容作为value
全局预编译(GO)的3个步骤

1. 创建GO(Global Object)对象;
2. 寻找变量声明作为GO的属性名,并赋值为undefined;
3. 寻找函数声明,放入作为GO的属性,并赋值为其函数体。

由于全局中没有参数的的概念,所以省去了实参形参相统一这一步。

注意

函数提升只会提升函数声明,而不会提升函数表达式
函数声明:function fun(){}
函数表达式:var fun1=function(){}

例子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(){};
}
//调用函数
fn(1);

步骤
1 创建AO对象

AO{}

2 找形参和变量声明,将形参名和变量名作为AO对象的属性名

AO{
a : undefined,
b : undefined
}

3 将实参值和形参统一

AO{
a : 1,
b : function(){…}
}

4 在函数体里面找函数声明,值赋予函数体。

AO{
a : function a(){…},
b : undefined,
d : function d(){…}
}

结果

// 函数
function fn(a){
     console.log(a);	 	//根据AO对象中的数据第一个打印的是:fn()
	// 变量声明+变量赋值(只提升变量声明,不提升变量赋值)
	var a = 123;		// 执行到这时,由于变量赋值是不提升的,所以函数被123覆盖了
	console.log(a);		// 123
	// 函数声明
	function a(){};		// 这里被提升上去了,可以忽略
	console.log(a);		// 123
	// 函数表达式
	var b = function(){};
	console.log(b);		// 根据AO对象中的数据:fn()
	// 函数
	 function d(){};
}
//调用函数
fn(1);

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值