JavaScript的自动分号插入(ASI)的规则是什么?
好吧,首先我应该问一下这是否与浏览器有关。
我已经读到,如果找到了无效的令牌,但是代码段在该无效令牌之前一直有效,如果在该令牌之前加了换行符,则在该令牌之前插入一个分号。
return _a+b;
..似乎不遵循此规则,因为_a是有效令牌。
$('#myButton') .click(function(){alert("Hello!")});
是否有人对规则有更深入的描述?
回答:
首先,您应该知道哪些语句受自动分号插入(为简洁起见也称为ASI)的影响:
- 空语句
var
声明- 表达陈述
do-while
声明continue
声明break
声明return
声明throw
声明
有关ASI的具体规则,请参见规范§11.9.1自动分号插入规则
描述了三种情况:
当遇到语法不允许的记号(
LineTerminator
或}
)时,如果出现以下情况,将在其前插入分号:- 令牌与上一个令牌分隔至少一个
LineTerminator
。 - 令牌是
}
- 令牌与上一个令牌分隔至少一个
例如 :
{ 12 } 3
转化为
{ 1;2 ;} 3;
在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
:
return "something";
转化为
return; "something";
以上是 JavaScript的自动分号插入(ASI)的规则是什么? 的全部内容, 来源链接: utcz.com/qa/401538.html