JavaScript の自動セミコロン挿入 (ASI) のルールは何ですか? 質問する

JavaScript の自動セミコロン挿入 (ASI) のルールは何ですか? 質問する

さて、まず、これがブラウザに依存しているかどうかを尋ねるべきでしょう。

無効なトークンが見つかったが、その無効なトークンまでのコードセクションが有効である場合、改行の後にトークンがあると、そのトークンの前にセミコロンが挿入されると読んだことがあります。

ただし、セミコロンの挿入によって発生するバグの一般的な例は次のとおりです。

return
  _a+b;

_a は有効なトークンとなるため、このルールには従っていないようです。

一方、呼び出しチェーンを分割すると、期待どおりに機能します。

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

ルールについてより詳しい説明を持っている人はいますか?

ベストアンサー1

まず、自動セミコロン挿入 (簡潔に ASI とも呼ばれます) によって影響を受けるステートメントを知っておく必要があります。

  • 空文
  • var声明
  • 表現文
  • do-while声明
  • continue声明
  • break声明
  • return声明
  • throw声明

ASIの具体的なルールは仕様書に記載されている。§11.9.1 自動セミコロン挿入のルール

3 つのケースについて説明します。

  1. 文法で許可されていない問題のあるトークンが検出されると、次の場合にそのトークンの前にセミコロンが挿入されます。
  • トークンは、前のトークンから少なくとも 1 つの で区切られますLineTerminator
  • トークンは}

:

    { 1
    2 } 3

に変換されます

    { 1
    ;2 ;} 3;

NumericLiteral 1最初の条件を満たし、後続のトークンは行末記号です。
22 番目の条件を満たし、後続のトークンは です}

  1. トークンの入力ストリームの終わりに達し、パーサーが入力トークン ストリームを 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";

おすすめ記事