好吧,首先我可能应该问这是否取决于浏览器。
我已经读过,如果找到了一个无效的标记,但代码部分在该无效标记之前是有效的,如果它前面有一个换行符,则在该标记之前插入一个分号。
但是,由分号插入引起的错误引用的常见示例是:
return _a+b;
..这似乎不遵循这个规则,因为 _a 将是一个有效的令牌。
另一方面,分解调用链按预期工作:
$('#myButton') .click(function(){alert("Hello!")});
有没有人对规则有更深入的描述?
首先,您应该知道哪些语句会受到自动分号插入的影响(也称为 ASI):
var
do-while
continue
break
return
throw
ASI 的具体规则,在规范搂11.9.1 自动分号插入规则中进行了描述
描述了三种情况:
当遇到语法不允许的违规标记时,如果出现以下情况,则会在其前面插入分号:
该令牌与前一个令牌至少相隔一个LineTerminator。
LineTerminator
}
例如 :
{ 1 2 } 3
被转化为
{ 1 ;2 ;} 3;
满足第NumericLiteral 1一个条件,后面的记号是行终止符。满足第二个条件,下面的记号 是。2``}
NumericLiteral
1
2``}
a = b ++c
转换为:
a = b; ++c;
限制生产:
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
经典的例子,带有ReturnStatement:
ReturnStatement
return "something";
return; "something";