gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:14:18 24 4
gpt4 key购买 nike

好吧,首先我应该问一下这是否取决于浏览器。

我读到如果发现无效标记,但代码部分在该无效标记之前有效,如果标记前面有换行符,则会在标记前插入一个分号。

然而,对于由分号插入引起的错误引用的常见示例是:

return
_a+b;

..这似乎不遵循这条规则,因为 _a 将是一个有效的标记。

另一方面,分解调用链按预期工作:

$('#myButton')
.click(function(){alert("Hello!")});

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

最佳答案

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

  • 空语句
  • var 语句
  • 表达陈述
  • do-while 语句
  • 继续语句
  • break 语句
  • return 语句
  • throw语句

ASI的具体规则,详见规范§11.9.1 Rules of Automatic Semicolon Insertion

描述了三种情况:

  1. 当遇到语法不允许的违规标记时,如果出现以下情况,则会在其前面插入一个分号:
  • token 与前一个 token 至少由一个 LineTerminator 分隔。
  • token 是

例如:

    { 1
2 } 3

转化为

    { 1
;2 ;} 3;

NumericLiteral1满足第一个条件,后面的token是行结束符。
2满足第二个条件,后面的token是

  1. 当遇到 token 输入流的末尾且解析器无法将输入 token 流解析为单个完整程序时,会自动在输入流的末尾插入一个分号。

例如:

    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 - JavaScript 的自动分号插入 (ASI) 的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57176473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com