Skip to content

一些JS的小知识

Posted on:2024年11月8日 at 22:54

作用域

JavaScript 语言编程进阶 - 掘金小册

在最新的 ECMAScript 规范中,定义了一个叫做 环境记录(Environment Record)的抽象概念,可理解为就是作用域。

Environment Record 是抽象的(abstract),它有三个子类,分别是:

  1. Declarative Environment Record,包括 var、const、let、class、module、function、catch;
  2. Object Environment Record,包括 with;
  3. Global Environment Record,浏览器中指 globalThis,Node.js 中指 global。

其中,Declarative Environment Record 还有两个子类:

  1. Function Environment Record —— function;
  2. 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 ,由于其 OuterEnvGlobal 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