第 1 章 作用域是什么

JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。

直觉:先预测,再运行

JavaScript 在执行前先经历编译;声明与赋值会被拆成编译器和引擎的两段工作,LHS 与 RHS 查询沿作用域链寻找标识符,并以不同错误结束。

先预测:只看最后输出而不记录中间绑定与调度顺序,最可能把哪个机制误判成语法偶然?请先写下预期,再切换样本比较首个偏离点。

权威目录定位

本页对应作者开放的一版仓库目录。目录标题仅用于一对一追踪,正文为独立教学重构:

  • Chapter 1: What is Scope?
  • Compiler Theory
  • Understanding Scope
  • Nested Scope
  • Errors

本页逐项覆盖 5 个公开目录条目;全系列基线为中文版三卷、英文一版六册、40 个正式单元和 211 个条目。学习地图与总复习是站内导航页,不冒充原书章节。

核心概念与状态所有权

这些概念不是孤立名词。每一个都要回答五个问题:输入由谁创建,绑定或状态保存在哪里,哪一步读取或修改它,失败怎样传播,结束后由谁清理。只有五项同时可观察,机制解释才算闭环。

#观察量本页判定方式
1编译阶段在“分词并形成语法结构”阶段保存前后状态并核对不变量
2作用域在“编译器登记声明”阶段保存前后状态并核对不变量
3LHS 查询在“引擎执行赋值或取值”阶段保存前后状态并核对不变量
4RHS 查询在“当前作用域响应查询”阶段保存前后状态并核对不变量
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: true
freeze 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 查询:对应“当前作用域响应查询”阶段的核心观察量。
  • 作用域链:对应“未命中时向外层查找”阶段的核心观察量。
  • 六阶段机制链已映射到正常、边界、失败与恢复证据。
  • 一版目录与现代规范状态分栏记录,后续变化不会冒充原书章节。

术语表

来源与改编边界

讨论

评论区加载中…