js预编译ao对象及go对象,js预编译是什么意思

大家好,小编为大家解答js预编译和执行过程一样吗的问题。很多人还不知道js预编译ao对象及go对象,现在让我们一起来看看吧!

前端面试中有时候会被问到你了解js的编译时和运行时吗?

不知道你们遇到过没,反正小编遇到过哈!

这道题搞懂了,说明你前端基础数比较扎实的!

今天咱们就来说一说这个难啃的骨头。

首先我们了解下编译时发生了什么?

先说下函数编译时发生的事情python for语句用法

1.创建AO对象(Activation Object(执行期上下文))

2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined

3.将实参值与形参相统一

4.在函数中找函数声明,作为属性名,值为函数体

下面我们看下这个程序:

function test(a,b){

	document.write(a);
	
	c=0;
	
	var c;
	
	a=3;
	
	b=2;
	
	document.write(b);
	
	function b(){}
	
	function d(){}
	
	document.write(b);
}
test(1)

那么这三处document.write分别会打印什么了?

根据上边的四步:第一步

AO{}

第二步:找变量和形参

AO{

a:undefiend,

b:undefiend,

c:undefiend

}

第三步:将实参与形参对应,那么就变成了

AO{

a:1,

b:undefiend,

c:undefiend

}

第四步:找函数声明,值赋为函数体

函数声明有b函数和c函数,那么AO就变成了这样:

AO{

a:1,

b:function(){},

c:undefiend,

d:function(){}

}

接下来开始运行:

那么第一处运行时 a的值就是1

接下来给c赋值为0,a赋值为3,b赋值为2

AO{

a:3,

b:2,

c:0,

d:function(){}

}

那么接下来第二处打印b的时候,b的值就是2。

继续执行函数b和d已经在预编译的时候赋值过了,直接跳过,然后打印b,那么第三处b的值还是2。

以上即为运行时与编译时的区别,我这里再总结一下,再预编译时候会形成以下两点:

1.函数声明整体提升

2.变量 声明提升

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值