JS分号自动加分号与不加分号

292 阅读1分钟

今天在执行下面片段的时候报错了

xxx

[1, 2, 3].forEach(function(val) {
  console.log(val)
})

报的TypeError: Cannot read property 'forEach' of undefined

猜想应该是[]被识别成属性读取符了,在[前加;果然正确运行了

准备再次学习一下Javascript的分号自动插入规则,拜读了尤大神的Hacking SemicolonsAn Open Letter to JavaScript Leaders Regarding Semicolons

下面记一下自己的理解

不加分号的一般规则

一般而言,回车(\n)是一个语句的结尾,除非:

  1. 语句有未闭合的括号、数组字面量、对象字面量或以不是有效结尾字符结尾(比如.,)
  2. 此行内容为++或者--(将自增/减下一个token(词?))
  3. for()while()doif()else后面没有{
  4. 下一行以[(+-*/.或其他的一些可以用在两个token间的一元运算符

第二条

i
++
j

被解析为i;++j 第三条的语句结构遇到一个语句或一个代码块才会结束

第四条也就是我遇到的问题,如果不想与前面的语句连在一起,加一个;

foo();
[1,2,3].forEach(bar)

foo()
;[1,2,3].forEach(bar)

Restricted Productions

returnthrowbreakcontinue、ES6的yield与以++--为后缀,后面紧跟回车的语句,该语句也就结束了,相当于有分号

return
{
  a: 1
}

等价于

return;
{
  a: 1
}
(function () {
  let a = 6
  a++ // 后面没有;也是没有歧义的
  [1, 2, 3].forEach(v => console.log(v))
})()

原文都是英文的,理解有可能有偏差,欢迎指正,谢谢