📜  JavaScript 的自动分号插入 (ASI) - Javascript (1)

📅  最后修改于: 2023-12-03 15:31:45.216000             🧑  作者: Mango

JavaScript 的自动分号插入 (ASI)

在 JavaScript 中,分号(;)用于分隔语句。然而,JavaScript 具有自动分号插入(ASI)功能。这意味着编译器会自动在语句末尾插入分号(;),除非它们已经存在或者它们不能被隐式分号分隔。

早期版本中的问题

在早期的 JavaScript 版本中,ASI 经常导致意外的结果。例如,以下代码:

function foo() {
  return
      {
          name: 'Alice'
      };
}

console.log(foo()); // undefined

实际上,这个例子中,由于自动插入分号,return 语句实际上是这样解析的:

function foo() {
  return;
      {
          name: 'Alice'
      };
}

因此,函数 foo 永远不会返回对象,而是返回 undefined

修复方法

为了避免这样的问题,编写 JavaScript 代码时需要保持良好的编码习惯,始终在语句末尾显式地加上分号。例如,上面的示例可以修复如下:

function foo() {
  return {
          name: 'Alice'
      };
}

console.log(foo()); // { name: 'Alice' }

此外,也有一些工具可以自动为您添加分号,例如 ESLint 和 Prettier。

隐式分号

在下列情况下,JavaScript 编译器会自动插入分号:

  • 当下一行的开头是 returnthrowbreakcontinue 语句时;
  • 当下一行以 ([{ 开始时;
  • 当前一行的末尾是可执行语句的结束符(例如 ++--))。

因此,在编写 JavaScript 代码时,需要始终考虑到这些规则。例如,以下代码:

let a = b + c
(d + e).toString()

由于括号开始于下一行,因此编译器会自动插入分号,代码实际上是这样的:

let a = b + c;
(d + e).toString();
总结

JavaScript 的自动分号插入功能可以使代码更加简洁。但是,在编写 JavaScript 代码时,需要始终注意语句之间的分隔符。无论您是自己显式地添加分号,还是使用代码格式化工具,只要始终保持一致,您就可以避免在编写代码时遇到问题。