Skip to content
标签
note
字数
540 字
阅读时间
3 分钟

背景

javascript 的解释器会对代码进行逐句匹配合法,碰到不合法的情况下就会插入分号

js
var name = 'martin'
var myName = name

从 var 开始拼接到 'martin' 的时候此时varname='martin' 是符合 js 的语法规则的,但是再次拼接下一个 token 的时候,变成 varname='martin'var 此时的代码显然已经不符合 js 的语法规则,所以解释器会在 'martin' 后面自动插入一个分号

规则一:部分操作符

规则: javascript 只会把以下这 5 种符号当做语句的延续与上一句进行拼接 (、[、+、-、/ 其余的拼接时默认中间带一个空格

例子:

js
  const myName = 'martin'
  const getName = myName
  (() => { return 2 })

以上代码会被转译成

js
  const myName = 'martin';
  const getName = myName(() => { return 2 });

在 constgetName=myName 后面因为是 (所以会自动拼接到 myName 后面,所以会被编译成上面的样子,此段代码也就会报错myNameisnotfunction

规则二:部分关键字

规则: javascript 会在return、throw、break、continue 该行后面自动插入分号,也就是在上面四个关键字后面如果换行的话会出现问题

例子:

js
  function showName() {
      return
      const name = 'martin'
  }

以上代码会被转译成

js
  function showName() {
      return;
      const name = 'martin';
  }

显然这样也就导致 return 出了一个 undefined,后面代码并不会执行

规则三:for 循环中

规则: 分号不会在 for 循环语句里自动添加例子

js
  for (let i = 0 i < 10 i++) {}

原本在 leti=0 之后会插入一个分号,但是以上代码因为在 for 循环里不会自动插入分号,所以会在词法解析的时候就报错Invalidorunexpectedtoken

规则四:作用域结束

规则: 在}标记之前一行、一个代码块、一段程序结束的地方自动添加分号例子

js
  if (true) {
    let name = 'martin'
  }

以上代码会编译成

js
  if (true) {
    let name = 'martin';
  }

参考

分号自动插入规则

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写