第 1 章 作用域是什么
JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。
直觉:先预测,再运行
JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。
先预测:只看最后输出而不记录中间绑定与调度顺序,最可能把哪个机制误判成语法偶然?请先写下预期,再切换样本比较首个偏离点。
权威目录定位
本页对应作者开放的一版仓库目录。目录标题仅用于一对一追踪,正文为独立教学重构:
- Chapter 1: What is Scope?
- Compiler Theory
- Understanding Scope
- Nested Scope
- Errors
本页逐项覆盖 5 个公开目录条目;全系列基线为中文版三卷、英文一版六册、40 个正式单元和 211 个条目。学习地图与总复习是站内导航页,不冒充原书章节。
核心概念与状态所有权
。
。
。
。
。
这些概念不是孤立名词。每一个都要回答五个问题:输入由谁创建,绑定或状态保存在哪里,哪一步读取或修改它,失败怎样传播,结束后由谁清理。只有五项同时可观察,机制解释才算闭环。
| # | 观察量 | 本页判定方式 |
|---|---|---|
| 1 | 编译阶段 | 在“分词并形成语法结构”阶段保存前后状态并核对不变量 |
| 2 | 作用域 | 在“编译器登记声明”阶段保存前后状态并核对不变量 |
| 3 | LHS 查询 | 在“引擎执行赋值或取值”阶段保存前后状态并核对不变量 |
| 4 | RHS 查询 | 在“当前作用域响应查询”阶段保存前后状态并核对不变量 |
| 5 | 作用域链 | 在“未命中时向外层查找”阶段保存前后状态并核对不变量 |
机制拆解
1. 分词并形成语法结构
分词并形成语法结构不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
2. 编译器登记声明
编译器登记声明不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
3. 引擎执行赋值或取值
引擎执行赋值或取值不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
4. 当前作用域响应查询
当前作用域响应查询不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
5. 未命中时向外层查找
未命中时向外层查找不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
6. 按查询类型产生结果或错误
按查询类型产生结果或错误不是口号,而是可执行检查点。输入必须来自上一阶段已经签发的状态;执行时记录当前绑定、接收者、值类型、队列位置或规范版本;输出必须能被下一阶段消费。若本阶段失败,应立即保存首个偏离点,不能让错误状态继续传播。
结合本章主张来看:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 因此本阶段至少要保留一份正常样本和一份反例。两者可以得到相同最终值,但只要中间查找路径、调用点、转换步骤或时间顺序不同,就不能判为同一机制。
目录主题逐项讲解
Chapter 1: What is Scope?
Chapter 1: What is Scope?在本单元中落到“分词并形成语法结构”这一观察点。阅读时先标出参与者与状态,再写出执行前、执行中和执行后的差异;随后主动制造空值、重复调用、错误接收者、迟到结果或旧环境能力缺失,验证解释是否仍成立。
Compiler Theory
Compiler Theory在本单元中落到“编译器登记声明”这一观察点。阅读时先标出参与者与状态,再写出执行前、执行中和执行后的差异;随后主动制造空值、重复调用、错误接收者、迟到结果或旧环境能力缺失,验证解释是否仍成立。
Understanding Scope
Understanding Scope在本单元中落到“引擎执行赋值或取值”这一观察点。阅读时先标出参与者与状态,再写出执行前、执行中和执行后的差异;随后主动制造空值、重复调用、错误接收者、迟到结果或旧环境能力缺失,验证解释是否仍成立。
Nested Scope
Nested Scope在本单元中落到“当前作用域响应查询”这一观察点。阅读时先标出参与者与状态,再写出执行前、执行中和执行后的差异;随后主动制造空值、重复调用、错误接收者、迟到结果或旧环境能力缺失,验证解释是否仍成立。
Errors
Errors在本单元中落到“未命中时向外层查找”这一观察点。阅读时先标出参与者与状态,再写出执行前、执行中和执行后的差异;随后主动制造空值、重复调用、错误接收者、迟到结果或旧环境能力缺失,验证解释是否仍成立。
六阶段证据链
本页的可执行链条是:分词并形成语法结构 → 编译器登记声明 → 引擎执行赋值或取值 → 当前作用域响应查询 → 未命中时向外层查找 → 按查询类型产生结果或错误。正常样本证明主路径,边界样本证明容量与身份,失败样本定位停止点,恢复样本证明旧绑定、旧值、旧任务和旧资源没有污染下一次执行。
最小可运行实验
下面的片段只保留本章最小机制。运行前先预测每一行的绑定、类型与输出,再修改一个条件观察首个偏离点:
function outer(a) {
function inner() {
return a + 1;
}
return inner();
}
console.log(outer(2));book: 你不知道的 JavaScript(一版三卷六册)
page: ydk-scope-01-what-is-scope
role: chapter
official_entries: 5
sample: normal | boundary | failure | recovery
first_divergence: null
bindings_stable: true
ordering_explained: true
cleanup_complete: truefreeze source + runtime + input
predict bindings + values + call-site + queue
inject one controlled fault
stop at first divergence
recover and replay the same sample
assert stable state and no stale work常见误区与故障注入
四类样本与验收
| 样本 | 注入方式 | 必查证据 | 通过条件 |
|---|---|---|---|
| 正常 | 规范输入与单次执行 | 绑定、值、调用点、队列 | 六阶段按预期完成 |
| 边界 | 空值、重复键、极值或嵌套调用 | 查找终点与类型边界 | 不发生隐式越界 |
| 失败 | 错误接收者、拒绝、旧提案或迟到结果 | 首个偏离点 | 明确停止、传播或降级 |
| 恢复 | 修复后重放完全相同输入 | 清理后的状态与任务数 | 无旧绑定、旧任务和旧资源 |
本页签发不变量是:JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。 最终输出、单次截图或一次性能数字都不能替代作用域查找、值转换、调用绑定、任务顺序和版本状态的完整轨迹。
版本与原书边界
本单元以 2014 至 2015 年一版目录为结构基线。正文使用现代可运行示例独立重构核心机制;现代规范差异单独披露,不修改或伪造原书目录。
站内示例优先使用今天可运行且语义稳定的写法,但目录清单、章节归属和历史判断仍以作者一版仓库为准。对已经撤回、替代或标准化后发生变化的能力,本页要求同时写出原书快照和当前状态。
练习
小结
- 编译阶段:对应“分词并形成语法结构”阶段的核心观察量。
- 作用域:对应“编译器登记声明”阶段的核心观察量。
- LHS 查询:对应“引擎执行赋值或取值”阶段的核心观察量。
- RHS 查询:对应“当前作用域响应查询”阶段的核心观察量。
- 作用域链:对应“未命中时向外层查找”阶段的核心观察量。
- 六阶段机制链已映射到正常、边界、失败与恢复证据。
- 一版目录与现代规范状态分栏记录,后续变化不会冒充原书章节。