深入JavaScript的运行原理
1.初始化全局对象
js引擎在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO)
- 该对象(GO) 所有的作用域(scope)都可以访问
- 里面会包含Date、Array、String、Number、setTimeout、setInterval等
- 其中还有一个window属性指向自己
2.执行上下文(Execution Contexts)
js引擎内部有一个执行上下文栈(Execution Context Stack,简称ECS),它是用于执行代码的调用栈。
- 全局的代码块为了执行会构建一个全局执行上下文(Global Execution Context,简称GEC)
- GEC会被放到ECS中
GEC被放入到ECS中里面包含两部分内容
- 第一部分:在代码执行前,在转成抽象语法树(AST)的过程中,会将全局定义的变量、函数等加入到GO中,但是不会赋值;这个过程称之为变量的作用域提升。
- 第二部分:在代码执行中,对变量赋值,或者执行其他的函数
3.认识VO对象(Variable Object)
每一个执行上下文会关联一个VO(Variable Object,变量对象),变量和函数声明都会被添加到这个VO对象中。
当全局代码被执行的时候,VO就是GO对象了
4.全局代码执行过程


在执行全局代码之前,创建了一个GO对象,里面有一些内置的对象,还有自己定义的变量,自己定义的变量普通类型都为undefined。全局执行上下文GEC中的VO就是GO对象。

执行全局代码,从上往下执行,将值赋值给自己定义的变量。
5.函数的执行过程
当执行过程执行到一个函数时,就会根据函数体创建一个函数执行上下文(Functional Execution Context,简称FEC),并且压进执行上下文栈ECS中
每个执行上下文都会关联一个VO,函数执行上下文关联的VO是什么呢?
- 当进入一个函数执行上下文时,会创建一个AO对象(Activation Object)
- 这个AO对象会使用arguments作为初始化,并且初始值是传入的参数
- 这个AO对象会作为执行上下文的VO来存放变量的初始化。
6.作用域和作用域链
- 当进入到一个执行上下文时,执行上下文也会关联一个作用域链(Scope Chain)
- 作用域链是一个对象列表,用于变量标识符的求值;
- 当进入一个执行上下文时,这个作用域链被创建,并且根据代码类型,添加一系列的对象;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
