javaScript函数预编译

函数预编译.
1,javaScript在函数代码执行前,会执行以下几个操作,分为三个步骤

  • 先进行语法分析 检查出最基本的语法错误;

  • 在进行预编译 为对象分配空间;

  • 最后解释执行代码 解释一行 ,执行一行, 遇到错误,立即停止执行,并报错。

  • 预编译发生在代码执行前的一瞬间
    预编译的具体过程

  • 预编译执行过程会生成GO (Global Object,等于window)和AO (Activetion Object,执行期上下文)

  • 先生成GO,生成后会逐行执行代码,遇到某个函数要执行时,在执行前的前一刻会预编译这个函数,生成AO,换言之,AO用于全局中的某个具体函数,而GO用于整个全局。

function fun(){
console.log(a);//undefinded
console.log(b);//undefinded
var a = 10;
console.log(a);//10
b = 10;
var sum = a+b;
console.log(sum);//20
}
console.log(sum);//undefinded
console.log(fun());//function(){}
fun();

GO创建对象过程

  • 1,首先创建GO对象
  • GO = {}
  • 2,在全局中寻找声明变量作为GO的属性 声明提前并且值为undefinded 赋值 留在原地
GO = {
a: undefinded
b: undefinded
sum: undefinded
}

-3 在全局中寻找函数声明 作为GO的属性 ,并将函数体的值赋予它,

GO = {
fun:function(){}

}
//然后开始逐行执行代码,遇到第一个console.log(a/b/sum);打印的是GO中找到的函数声明的对象a,b,sum;

AO创建过程:
第一次打印完b后,代码执行到 然后开始创建AO,其创建过程和GO相似只是多了一步实参形参相统一而已。
1.创建AO对象。
AO{}
2.在相应函数中寻找形参和变量声明作为执行期上下文的属性,并将undefined赋给它们。
AO{
a:undefined;
b:undefined;
c:undefined;

}
3.实参形参相统一。
4.寻找函数声明作为它的属性,并将函数体赋给它,重名会覆盖
AO{

   fun:function{...};

}

开始执行函数fun,最后console.log(fun)结果为function(){},

执行AO中啊,b的值被赋成10,执行后console.log(b)结果为20.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值