全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 21 道配套习题

JS引擎与运行时原理专题

专题说明

本专题聚焦JavaScript引擎内部机制与运行时原理,涵盖V8引擎架构、内存管理、JIT编译优化、执行上下文、事件循环、垃圾回收等核心知识,帮助开发者深入理解JS底层工作机制,写出更高效的代码。

学习目标

  1. 理解JavaScript引擎的架构与编译执行流程
  2. 掌握内存管理与垃圾回收机制原理
  3. 理解JIT编译优化与隐藏类机制
  4. 掌握执行上下文、作用域链、this绑定的底层原理
  5. 深入理解事件循环、宏任务与微任务的执行顺序

学习内容

本专题覆盖以下核心知识点:

  • JavaScript引擎架构(V8、SpiderMonkey、JavaScriptCore)
  • 编译与解释执行机制
  • JIT编译优化原理
  • 内存分代管理与垃圾回收算法
  • 隐藏类与内联缓存
  • 执行上下文与调用栈
  • 事件循环与任务队列
  • 浏览器与Node.js运行时差异

学习建议

  1. 先理解引擎的整体架构,再深入学习各子系统
  2. 结合实际代码示例理解理论概念
  3. 使用Chrome DevTools进行内存分析和性能调优实践
  4. 关注不同引擎的实现差异,理解背后的设计思想

📝 发现内容有误?点击此处直接编辑

📝 配套习题(21 题)

1
多选题

在V8引擎中,以下哪些措施可以有效预防和检测内存泄漏?

A

使用WeakMap和WeakSet存储对象引用

B

在组件卸载时清除定时器和事件监听器

C

使用Chrome DevTools的Memory面板进行堆快照对比

D

将所有变量声明为全局变量以便于访问

E

避免创建闭包来防止内存占用

F

使用performance.memory API监控内存使用趋势

2
多选题

以下哪些场景可能导致JavaScript内存泄漏?

A

未清理的console.log引用

B

循环引用的对象结构

C

未解绑的DOM事件监听器

D

闭包引用了不再需要的变量

E

被遗忘的Promise回调

F

脱离DOM树的元素被JavaScript引用

3
单选题

V8引擎将堆内存分为新生代(New Space)和老生代(Old Space),以下关于这种分代设计的描述,哪项是正确的?

A

新生代使用标记-清除算法,老生代使用Scavenge算法

B

新生代存放存活时间短的对象,老生代存放存活时间长的对象

C

新生代和老生代的内存空间大小相同

D

对象一旦创建就无法从新生代晋升到老生代

4
填空题

现代JavaScript引擎(如V8)主要使用_________算法进行垃圾回收,该算法通过从______开始遍历,标记所有可达对象,未被标记的对象将被回收。

5
填空题

WeakMap和WeakSet中的"Weak"指的是______,这意味着它们不会阻止________回收其键对象,当键对象没有其他引用时,对应的键值对会自动从集合中移除。

6
多选题

关于JavaScript的编译与解释执行,以下哪些说法是正确的?

A

JavaScript是纯解释型语言,代码不会经过任何编译过程

B

V8引擎在执行前会先将JavaScript编译为字节码

C

JIT编译器会将热点代码编译为机器码以提高执行效率

D

首次执行时代码以字节码或解释方式运行,性能较低

E

编译后的机器码会永久缓存,不会重新编译

F

优化编译器会基于类型反馈信息进行激进优化

7
单选题

相比于编译执行,解释执行的主要特点是什么?

A

执行效率更高,内存占用更小

B

启动速度更快,但执行效率较低

C

代码安全性更好,难以被逆向

D

需要提前编译,不依赖运行时环境

8
多选题

关于JIT(Just-In-Time)编译,以下哪些说法是正确的?

A

JIT编译发生在运行时,而不是执行前

B

JIT编译的代码执行速度比解释执行更快

C

JIT编译会增加应用的启动时间

D

JIT编译后的代码可以直接被CPU执行

E

JIT编译只适用于静态类型语言

F

所有JavaScript引擎都使用相同的JIT编译策略

9
单选题

函数内联(Function Inlining)是JIT编译的重要优化手段,以下关于内联的说法正确的是?

A

内联会减少函数调用开销,但可能增加代码体积

B

所有函数都应该被内联以获得最佳性能

C

内联只能由开发者手动完成,编译器不会自动内联

D

递归函数最适合内联优化

10
填空题

V8引擎使用______(Hidden Class)来优化对象属性访问,使用________(Inline Cache)来缓存属性访问的优化路径。

11
单选题

以下哪个JavaScript引擎被Chrome浏览器和Node.js使用?

A

SpiderMonkey

B

JavaScriptCore

C

V8

D

Chakra

12
多选题

V8引擎如何高效表示JavaScript对象?以下哪些机制被V8采用?

A

隐藏类(Hidden Classes)

B

内联缓存(Inline Caches)

C

属性存储在固定偏移位置

D

所有对象使用相同的隐藏类

E

动态属性添加会创建新的隐藏类

F

属性名称直接存储在对象中

13
单选题

JavaScript中有几种类型的执行上下文?

A

2种:全局执行上下文和函数执行上下文

B

3种:全局、函数和块级执行上下文

C

3种:全局、函数和eval执行上下文

D

4种:全局、函数、块级和模块执行上下文

14
判断题

当调用栈中压入的执行上下文数量超过引擎限制时,会抛出"栈溢出"(Stack Overflow)错误。

A

B

15
多选题

以下哪些是浏览器与Node.js运行环境的主要差异?

A

全局对象:浏览器是window,Node.js是global

B

模块系统:浏览器使用ES Modules,Node.js支持CommonJS和ES Modules

C

DOM API:浏览器有DOM,Node.js没有

D

文件系统:Node.js可以直接访问,浏览器受限

E

事件循环机制完全不同

F

异步API:浏览器有fetch,Node.js有http模块

16
多选题

关于JavaScript事件循环的执行顺序,以下哪些说法是正确的?

A

每个事件循环周期开始时,先执行同步代码

B

同步代码执行完毕后,先清空微任务队列

C

微任务清空后,从宏任务队列取出一个任务执行

D

每个宏任务执行完毕后,都会清空微任务队列

E

微任务可以在当前宏任务执行过程中添加新的微任务,并在当前周期清空

F

宏任务和微任务的执行顺序由添加时间决定

17
多选题

以下代码执行后,输出顺序是什么?

JavaScript
console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

console.log('4');
A

1, 4, 3, 2

B

1, 4, 2, 3

C

1, 2, 4, 3

D

1, 3, 4, 2

18
填空题

JavaScript的事件循环由__________________________三个核心部分组成,执行顺序是先清空调用栈,然后清空微任务队列,最后从宏任务队列取一个任务执行,如此循环往复。

19
多选题

以下关于垃圾回收算法的说法,哪些是正确的?

A

引用计数算法无法处理循环引用

B

标记-清除算法可以正确处理循环引用

C

标记-整理算法可以解决内存碎片问题

D

复制算法(Scavenge)空间利用率高,适合大内存

E

分代回收利用了"大多数对象存活时间短"的特点

F

增量标记可以减少GC造成的停顿时间

20
单选题

在V8的分代回收中,对象从新生代晋升到老生代的条件是什么?

A

对象大小超过一定阈值

B

对象在新生代GC中存活一次以上

C

对象被全局变量引用

D

以上都有可能

21
判断题

JavaScript开发者可以手动调用垃圾回收器立即回收内存。

A

B

← 上一个专题 JS安全与边界处理
下一个专题 → JS浏览器与DOM高级

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库