Skip to content

编译流水线---运行环境

  1. V8 如何提升 JavaScript执行速度
  • 早期缓存机器码,之后重构为缓存字节码
  1. JavaScript中访问一个属性时,V8 做了哪些优化
  • 隐藏类
  • 内联缓存

运行时环境:运行 JavaScript 代码的基石

运行时环境包括:堆空间和栈空间、全局执行上下文、全局作用域、内置的内建函数、宿主环境提供的扩展函数和对象,还有消息循环系统

运行时环境

宿主

宿主环境 v8的宿主环境可以是浏览器,也可以是 node 环境

浏览器为 V8 提供基础的消息循环系统、全局变量、Web API

V8的核心是实现ECMAScript标准,比如:ObjectFunctionString,还提供垃圾回收、协程等

构造数据存储空间:堆空间和栈空间

Chrome中,只要打开一个渲染进程,渲染进程便会初始化V8,同时初始化堆空间和栈空间。

栈是内存中连续的一块空间,采用“先进后出”的策略。

在函数调用过程中,涉及到上下文相关的内容都会存放在栈上,比如原生类型、引用的对象的地址、函数的执行状态、this值等都会存在栈上

当一个函数执行结束,那么该函数的执行上下文便会被销毁掉。

堆空间是一种树形的存储结构,用来存储对象类型的离散的数据,比如:函数、数组,在浏览器中还有windowdocument

全局执行上下文和全局作用域

执行上下文

执行上下文中主要包含三部分,变量环境、词法环境和this关键字

全局执行上下文在V8的生存周期内是不会被销毁的,它会一直保存在堆中

ES6中,同一个全局执行上下文中,都能存在多个作用域:

javascript
var x = 5;
{
  let y = 2;
  const z = 3;
}
作用域

当 V8 调用了一个函数时,就会进入函数的执行上下文,这时候全局执行上下文和当前的函数执行上下文就形成了一个栈结构。比如执行下面这段代码:

javascript
var x = 1;
function show_x() {
  console.log(x);
}
function bar() {
  show_x();
}
bar();

当执行到 show_x 的时候,其栈状态如下图所示: 函数调用栈

构造事件循环系统

事件循环系统

V8需要一个主线程,用来执行JavaScript和执行垃圾回收等工作

V8是寄生在宿主环境中的,V8所执行的代码都是在宿主的主线程上执行的

如果主线程正在执行一个任务,这时候又来了一个新任务,把新任务放到消息队列中,等待当前任务执行结束后,再从消息队列中取出正在排列的任务,执行完这个任务之后,再重复这个过程