标签
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';
}