gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:03:32 25 4
gpt4 key购买 nike

好吧,首先我应该问这是否依赖于浏览器。

我读到,如果发现无效 token ,但该代码段在该无效 token 之前一直有效,则在 token 前面插入分号(如果 token 前面有换行符)。

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

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

例如:

    { 1
2 } 3

转换为

    { 1
;2 ;} 3;

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

  • 当遇到 token 输入流的末尾并且解析器无法将输入 token 流解析为单个完整程序时,则会在输入流的末尾自动插入分号。
  • 例如:

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

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