深入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中里面包含两部分内容

  1. 第一部分:在代码执行前,在转成抽象语法树(AST)的过程中,会将全局定义的变量、函数等加入到GO中,但是不会赋值这个过程称之为变量的作用域提升
  2. 第二部分:在代码执行中,对变量赋值,或者执行其他的函数

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)
  • 作用域链是一个对象列表,用于变量标识符的求值; 
  • 当进入一个执行上下文时,这个作用域链被创建,并且根据代码类型,添加一系列的对象;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部