图解 Google V8 # 09:运行时环境:运行JavaScript代码的基石

简介: 图解 Google V8 # 09:运行时环境:运行JavaScript代码的基石

说明

图解 Google V8 学习笔记



运行时环境


在执行 JavaScript 代码之前,V8 就已经准备好了代码的运行时环境,包括:


  • 堆空间和栈空间
  • 全局执行上下文
  • 全局作用域
  • 内置的内建函数
  • 宿主环境提供的扩展函数和对象
  • 消息循环系统



542a1e85973b48fda5eae09b8b03bf1b.png


什么是宿主环境?


要执行 V8,则需要有一个宿主环境,宿主环境可以是浏览器中的渲染进程,可以是 Node.js 进程, 也可以是其他的定制开发的环境,而这些宿主则提供了很多 V8 执行 JavaScript 时所需的基础功能部件。

宿主环境和 V8 的关系:


b2e351eaa0654f9780aad83bb37eb2e1.png


V8 和浏览器的渲染进程的关系看成病毒和细胞的关系:


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

   V8 的核心是实现了 ECMAScript 标准,这相当于病毒自己的 DNA 或者 RNA,V8 只提供了 ECMAScript 定义的一些对象和一些核心的函数,这包括了 Object、Function、String。

   除此之外,V8 还提供了垃圾回收器、协程等基础内容,不过这些功能依然需要宿主环境的配合才能完整执行。




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


栈空间


栈空间主要是用来管理 JavaScript 函数调用的,栈是内存中连续的一块空间,同时栈结构是“先进后出”的策略。


特点:


   先进后出

   空间连续

   查找效率非常高


函数调用过程中,什么会存在栈里:


   原生类型

   引用到的对象的地址

   函数的执行状态

   this 值等


V8 对栈空间的大小做了限制,超出就会报栈溢出的错误:Uncaught RangeError: Maximum call stack size exceeded。


例子:723c2fd1856d432c8756d1a0968afc17.png


堆空间


堆空间是一种树形的存储结构,用来存储对象类型的离散的数据,以及一些占用内存比较大的数据。

存在堆空间的:

  • 函数
  • 数组
  • 在浏览器中还有 window 对象
  • document 对象等



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


V8 初始化了基础的存储空间之后,接下来就需要初始化全局执行上下文和全局作用域。


当 V8 开始执行一段可执行代码时,会生成一个执行上下文来维护执行当前代码所需要的变量声明、this 指向等。


执行上下文中主要包含:


  • 变量环境
  • 词法环境:包含了使用 let、const 等变量的内容
  • this 关键字


e917cefa632e4fb394983bfbc73a932a.png


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


例子:

var x = 5
{
    let y = 2
    const z = 3
}

这段代码在执行时,会有两个对应的作用域,一个是全局作用域,另外一个是括号内部的作用域,但是这些内容都会保存到全局执行上下文中。



构造事件循环系统


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


V8 是寄生在宿主环境中的,它并没有自己的主线程,而是使用宿主所提供的主线程,V8 所执行的代码都是在宿主的主线程上执行的。


在执行完代码之后,为了让线程继续运行,通常的做法是在代码中添加一个循环语句,在循环语句中监听下个事件。


如果主线程正在执行一个任务,这时候又来了一个新任务,那么这种情况下就需要引入一个消息队列,让新任务暂存到消息队列中,等当前的任务执行结束之后,再从消息队列中取出正在排队的任务。当执行完一个任务之后,我们的事件循环系统会重复这个过程,继续从消息队列中取出并执行下个任务。


事件循环系统主要用来处理任务的排队和任务的调度。



目录
相关文章
|
3月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
6月前
|
数据采集 机器学习/深度学习 编解码
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
本文详细介绍了一个简化版 Veo 3 文本到视频生成模型的构建过程。首先进行了数据预处理,涵盖了去重、不安全内容过滤、质量合规性检查以及数据标注等环节。
396 5
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
|
5月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
150 1
|
6月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
6月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
109 0
|
8月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
694 9
|
9月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
630 11
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
288 2
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
219 1
JavaScript中的原型 保姆级文章一文搞懂
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
142 0

热门文章

最新文章