JavaScript的自动分号插入(ASI)的规则是什么?

好吧,首先我应该问一下这是否与浏览器有关。

我已经读到,如果找到了无效的令牌,但是代码段在该无效令牌之前一直有效,如果在该令牌之前加了换行符,则在该令牌之前插入一个分号。

return

_a+b;

..似乎不遵循此规则,因为_a是有效令牌。

$('#myButton')

.click(function(){alert("Hello!")});

是否有人对规则有更深入的描述?

回答:

首先,您应该知道哪些语句受自动分号插入(为简洁起见也称为ASI)的影响:

  • 空语句
  • var 声明
  • 表达陈述
  • do-while 声明
  • continue 声明
  • break 声明
  • return 声明
  • throw 声明

有关ASI的具体规则,请参见规范§11.9.1自动分号插入规则

描述了三种情况:

  1. 当遇到语法不允许的记号(LineTerminator})时,如果出现以下情况,将在其前插入分号:

    • 令牌与上一个令牌分隔至少一个LineTerminator
    • 令牌是 }

例如

    { 1

2 } 3

转化为

    { 1

;2 ;} 3;

NumericLiteral1满足所述第一条件,令牌是行终止如下。

2满足第二条件,令牌是以下}

  1. 当遇到令牌输入流的末尾并且解析器无法将输入令牌流作为单个完整程序进行解析时,则分号会自动插入到输入流的末尾。

例如

    a = b

++c

转换为:

    a = b;

++c;

  1. 如果某种语法的生产允许使用令牌,但是该生产是 受限生产 ,则会在受限令牌之前自动插入分号。

限量生产:

    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

回到顶部