1. bug

碰到一个问题,这段代码会报一个num is not defined的错。但是num命名已经定义了,在控制台一句一句敲是没问题的。后来发现在第3行加个分号就可以了。

1
2
3
4
5
6
7
8
const i = 0
const j = 1
const nums = [1,2,3,4,5]
[nums[i], nums[j]] = [nums[j], nums[i]]

/* 报错信息
Uncaught ReferenceError: nums is not defined
*/

2. 不写分号需要注意的情况

由于我们的代码规范是不加分号的,总结一下不加分号需要注意的情况。

2.1 以括号开头的语句

这里看似是两个独立执行的函数表达式,其实第三组括号被理解为传参。

1
2
3
4
5
6
7
8
9
10
(function(a){
console.log(a);
})()/*这里没有被自动插入分号*/
(function(a){
console.log(a);
})()

/* 报错信息
(intermediate value)(...) is not a function
*/

2.2 以数组开头的语句

被理解为下标运算符和逗号表达式

1
2
var a = [[]]/*这里没有被自动插入分号*/
[3, 2, 1, 0].forEach(e => console.log(e))

2.3 以正则表达式开头的语句

正则的第一个斜杠被理解为除号,后面的意思就变了

1
2
3
var x = 1, g = {test:()=>0}, b = 1/*这里没有被自动插入分号*/
/(a)/g.test("abc")
console.log(RegExp.$1)

2.4 以Template开头的语句

因为没有自动插入分号,函数 f 被认为跟 Template 一体的,进而被莫名其妙地执行了一次。

1
2
3
4
5
6
var f = function(){
return "";
}
var g = f/*这里没有被自动插入分号*/
`Template`.match(/(a)/);
console.log(RegExp.$1)

参考资料