作用域
JavaScript 语言编程进阶 - 掘金小册
在最新的 ECMAScript 规范中,定义了一个叫做 环境记录(Environment Record)的抽象概念,可理解为就是作用域。
Environment Record 是抽象的(abstract),它有三个子类,分别是:
Declarative Environment Record,包括 var、const、let、class、module、function、catch;Object Environment Record,包括 with;Global Environment Record,浏览器中指 globalThis,Node.js 中指 global。
其中,Declarative Environment Record 还有两个子类:
Function Environment Record—— function;Module Environment Record—— module。
包含关系如下:

不同类型的 Environment Record,其 OuterEnv 类型是受限的。比如,Global Environment Record 的 OuterEnv 总是 null,而 Module Environment Record 的 OuterEnv 总是 Global Environment Record 。
后者的例子如下:
// index.js
var foo = 1;
function onload() {
var bar = 2;
import("./dynamic.js");
}
// dynamic.js
var baz = 3;
console.log(foo + bar + baz);
dynamic.js 所在的作用域,是一个 Module Environment Record ,由于其 OuterEnv 是 Global Environment Record ,因此它可以访问到 foo 变量,但是访问不到 bar 变量,于是在 console.log 那一行就会报错。
运算符
&&= 逻辑与赋值操作符
ES2021新增
仅当左侧变量为真值时,将右侧赋值给左侧变量
if (x) x = y; // 使用if
x = x && y; // 使用逻辑与运算符
x &&= y; // 逻辑与赋值
??= 空置合并赋值操作符
ES2021新增
仅当左侧值为null或undefined时,将右侧赋值给左侧变量、
let dalay = 0;
delay = delay || 1000; // delay 被误赋值
delay ??= 1000; // delay 保持为0