第十章|执行机制与语言演进
前九章把 JavaScript 的具体行为逐个拆开。本章回头整理它们的共同基础:词法环境解释变量可见性,执行上下文记录运行进度,宿主安排外部工作,引擎在不改变语义的前提下寻找快速路径。
本章在全书中的位置
先完成函数、对象、异步和模块,再阅读执行机制。这样“环境记录”“作业”“原型查找”都是已见过的现象,抽象名称才有落脚点。新增 API 放在后半章,因为先理解迭代协议与时间语义,才看得出它们解决的困难。
text
作用域、闭包 ──→ 环境记录 ──→ 执行上下文
对象与属性 ────→ 形状反馈 ──→ 引擎优化
迭代与资源 ────→ 现代协议 ──→ 明确生命周期
日期与时区 ────→ 时间类型 ──→ 精确表达含义
最后:读规范定位规则阅读顺序
- 执行上下文:区分调用栈、作用域链、全局对象与 Realm。
- 引擎怎样加速代码:解释形状、反馈与不改变结果的优化。
- 现代能力补充:运行迭代、分组、异步收集与资源释放。
- 时间模型与新特性:区分瞬间、日期、地区时间和时长。
- 读懂规范与旧代码:定位抽象操作,理解 eval 与历史语义。
- 旧项目维护:在原有脚本、构造函数和 CommonJS 形式中修复状态与依赖。
- 语言演进:把 ES6+ 主线、年度标准、提案与当前运行能力联系起来。
本章的实验依然是小范围语义验证。当前能力与 Temporal 使用独立 Node 26.0.0 环境,基础对照保留 Node 22。环境不支持时先按对应篇目切换再运行;不要把所有代码粘在同一文件中运行,特别是旧引擎不能解析的语法。
把推导应用到新例子
本章不只区分名词,还要能跟踪状态变化:给异步函数标出暂停前后的调用关系;为属性读取列出优化必须保留的副作用;按日志比较数组链与惰性链;对重复的当地时间选择消歧策略;沿规范找出最终传播的是哪一个完成结果。
可以先预测,再运行正文的小实验,最后只改变一个前提。例如把数据字段改成getter、把日历天改成24小时、把普通括号改成逗号表达式,观察之前的解释是否仍成立。
完成练习时,分别交付一个带可修改状态的闭包、一个能识别错误缓存的对照实验、一份保持选择顺序的集合结果、一串跨年的月末日期,以及四条转换路径的断言。它们各自独立,不需要拼成项目。环境不支持的新 API 要注明尚未实跑;能解释预期不等于已经验证运行。
如果能把答案连接到前面的具体例子,你已经有了一套能解释新问题的语言模型。遇到分歧时,以最小实验定位现象,再用规范和对应实现判断适用范围。