gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:02:49 24 4
gpt4 key购买 nike

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

我已经读过,如果找到了一个无效的标记,但代码部分在该无效标记之前是有效的,如果它前面有一个换行符,则在该标记之前插入一个分号。

但是,由分号插入引起的错误引用的常见示例是:

return
_a+b;

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

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

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

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

最佳答案

首先你应该知道哪些语句会受到自动分号插入(简称 ASI)的影响:

  • 空语句
  • var 语句
  • 表达式语句
  • do-while 语句
  • 继续语句
  • break语句
  • 返回语句
  • 抛出语句

ASI 的具体规则,在规范§11.9.1 Rules of Automatic Semicolon Insertion 中有描述。

分三种情况说明:

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

例如:

    { 1
2 } 3

转化为

    { 1
;2 ;} 3;

NumericLiteral 1满足第一个条件,后面的记号是行终止符。
2满足第二个条件,后面的token是}

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

例如:

    a = b
++c

转化为:

    a = b;
++c;
  1. 这种情况发生在语法的某些产生式允许 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

经典的例子,带有ReturnStatement:

    return 
"something";

转化为

    return;
"something";

关于javascript - JavaScript 的自动分号插入 (ASI) 的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846283/

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