JS高级-运行原理
初始化全局对象
- js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO)
- 该对象 所有的作用域(scope)都可以访问;
- 里面会包含Date、Array、String、Number、setTimeout、setInterval等等;
- 其中还有一个window属性指向自己;
执行上下文
- js引擎内部有一个执行上下文栈(简称ECS),它是用于执行代码的调用栈。
- 那么现在它要执行谁呢?执行的是全局的代码块:
- 全局的代码块为了执行会构建一个 Global Execution Context(GEC);
- GEC会 被放入到ECS中 执行;
- GEC被放入到ECS中里面包含两部分内容:
- 第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,但是并不会 赋值;
- 这个过程也称之为变量的作用域提升
- 第二部分:在代码执行中,对变量赋值,或者执行其他的函数;
- 第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,但是并不会 赋值;
认识VO对象
- 每一个执行上下文会关联一个VO(Variable Object,变量对象),变量和函数声明会被添加到这个VO对象中。
- 当全局代码被执行的时候,VO就是GO对象了
全局代码执行过程(执行前)
1 | var message = "Global Message" |
全局代码执行过程(执行后)
函数如何被执行呢?
- 在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文(简称FEC), 并且压入到EC Stack中。
- 因为每个执行上下文都会关联一个VO,那么函数执行上下文关联的VO是什么呢?
- 当进入一个函数执行上下文时,会创建一个AO对象(Activation Object);
- 这个AO对象会使用arguments作为初始化,并且初始值是传入的参数;
- 这个AO对象会作为执行上下文的VO来存放变量的初始化;
函数的执行过程(执行前)
1 | var message = "Global Message" |
函数的执行过程(执行后)
函数代码查找变量
1**.函数中有自己的变量定义**
1 | // 1.函数中有自己的message |
2.函数中没有变量定义
1 | // 2.函数中没有自己的message |
函数的多次执行(第一次123)
1 | var message = "Global Message" |
函数的多次执行(第二次321)
作用域提升面试题
1 | // 1.面试题一: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 十一的博客!
评论