今天在执行下面片段的时候报错了
xxx
[1, 2, 3].forEach(function(val) {
console.log(val)
})
报的TypeError: Cannot read property 'forEach' of undefined
猜想应该是[]被识别成属性读取符了,在[前加;果然正确运行了
准备再次学习一下Javascript的分号自动插入规则,拜读了尤大神的Hacking Semicolons与An Open Letter to JavaScript Leaders Regarding Semicolons
下面记一下自己的理解
不加分号的一般规则
一般而言,回车(\n)是一个语句的结尾,除非:
- 语句有未闭合的括号、数组字面量、对象字面量或以不是有效结尾字符结尾(比如
.和,) - 此行内容为
++或者--(将自增/减下一个token(词?)) for()、while()、do、if()或else后面没有{- 下一行以
[、(、+、-、*、/、.或其他的一些可以用在两个token间的一元运算符
第二条
i
++
j
被解析为i;++j
第三条的语句结构遇到一个语句或一个代码块才会结束
第四条也就是我遇到的问题,如果不想与前面的语句连在一起,加一个;
foo();
[1,2,3].forEach(bar)
或
foo()
;[1,2,3].forEach(bar)
Restricted Productions
return、throw、break、continue、ES6的yield与以++、--为后缀,后面紧跟回车的语句,该语句也就结束了,相当于有分号
return
{
a: 1
}
等价于
return;
{
a: 1
}
(function () {
let a = 6
a++ // 后面没有;也是没有歧义的
[1, 2, 3].forEach(v => console.log(v))
})()
原文都是英文的,理解有可能有偏差,欢迎指正,谢谢