首先应该知道哪些语句会用到自动插入分号(Automatic Semisolon Insertion, ASI):
- 空语句
- var
语句
- 表达式
- do-while
语句
- continue
语句
- break
语句
- return
语句
- throw
语句
ASI的具体规则,在此规范中描述:§11.9.1 Rules of Automatic Semicolon Insertion
描述了三个示例:
1.如果遇到语法不允许的token(行终结符
或 }
),将在它前面插入一个分号:
- token被至少一个 行终结符
与前面的token分开
- 这个token是 }
例如:
{ 1
2 } 3
被转换成:
{ 1
;2 ;} 3;
数值 1
遇到第一种情况,其随后的token是一个行终结符。2
遇到第二种情况,其随后的token是 }
.
2.当遇到token的输入流的末尾并且解析器不能将输入的token流解析成一个单独完整的程序,然后一个分号就会被自动插入到输入流的末尾。
例如:
a = b
++c
被转换成:
a = b;
++c;
3.这种情况是发生在,当语法的某些产生式使得token合法时,且产生式是有条件限制的产生式,在被限制的token之前会自动插入分号。
有条件限制的产生式:
UpdateExpression :
LeftHandSideExpression [no LineTerminator here] ++
LeftHandSideExpression [no LineTerminator here] --
ContinueStatement :
continue ;
continue [no LineTerminator here] LabelIdentifier ;
BreakStatement :
break ;
break [no LineTerminator here] LabelIdentifier ;
ReturnStatement :
return ;
return [no LineTerminator here] Expression ;
ThrowStatement :
throw [no LineTerminator here] Expression ;
ArrowFunction :
ArrowParameters [no LineTerminator here] => ConciseBody
YieldExpression :
yield [no LineTerminator here] * AssignmentExpression
yield [no LineTerminator here] AssignmentExpression
return语句
的一个典型的例子,
return
"something";
被转换成:
return;
"something";