JS从编译到运行代码的过程

js运行分为两个阶段

具体AST树以及bytecode等名词看我上一篇文章(浏览器工作原理)

1. 编译阶段(js代码---->AST树)

代码被解析的过程,v8引擎内部会在堆内存帮助我们创建一个对象(GlobalObject->GO)简称GO,在编译阶段确定有哪些变量的定义(例如 var name = test, age = 18),在执行代码前,但是还不能赋值,此时值统一为undefined,待到执行代码时变量从全局执行上下文 里查找对应变量

2. 代码执行阶段(bytecode---->运行结果)

运行代码时,v8引擎内部会有一个执行上下文栈(Execution Context Stack)ECStack,执行代码的时候,需要创建全局执行上下文(Global Execution Context)(全局代码需要被执行时创建),执行代码时,GEC会放入ECStack栈,全局执上下文内含一个 VO(variable Object)----->GO,以及执行的代码体, 此时执行代码,编译阶段定义的变量开始依次赋值。

3. 编译阶段存在函数定义时

3.1 在编译阶段如果有函数(例foo)定义,会在内存开辟新的一块空间存储0xa00,全局对象GO里面定义的函数(f00)保存的是该空间地址 foo: 0xa00(引用),存储在堆内存,该地址存储包含函数的 ①父级作用域scope:parentScope 指向VO:GO 即指向GO ②函数执行体(代码块)。

3.2 全局运行阶段,在上下文栈ECStack(函数调用栈),会首先通过GO找到函数指向地址,并创建一个函数执行上下文(Functional Execution Context)FEC。

3.3 在函数执行前, 即函数的编译阶段,函数执行上下文中也会创建一个VO:AO(Activation Object 活跃对象, 即函数里面的变量,参数2.等),以及开始执行代码域(例如函数内部定义的变量开始赋值),之后开始执行函数。

注意:在函数执行完后,FEC会弹出ECStack, 创建的VO:AO没有指向后也会销毁

JS从编译到运行代码的过程_第1张图片

想要学习更深入的原理过程,可以搜索王红元老师的课程视频讲解

你可能感兴趣的:(js高级知识点,javascript,前端,开发语言)