さて、まず、これがブラウザに依存しているかどうかを尋ねるべきでしょう。
無効なトークンが見つかったが、その無効なトークンまでのコードセクションが有効である場合、改行の後にトークンがあると、そのトークンの前にセミコロンが挿入されると読んだことがあります。
ただし、セミコロンの挿入によって発生するバグの一般的な例は次のとおりです。
return
_a+b;
_a は有効なトークンとなるため、このルールには従っていないようです。
一方、呼び出しチェーンを分割すると、期待どおりに機能します。
$('#myButton')
.click(function(){alert("Hello!")});
ルールについてより詳しい説明を持っている人はいますか?
ベストアンサー1
まず、自動セミコロン挿入 (簡潔に ASI とも呼ばれます) によって影響を受けるステートメントを知っておく必要があります。
- 空文
var
声明- 表現文
do-while
声明continue
声明break
声明return
声明throw
声明
ASIの具体的なルールは仕様書に記載されている。§11.9.1 自動セミコロン挿入のルール
3 つのケースについて説明します。
- 文法で許可されていない問題のあるトークンが検出されると、次の場合にそのトークンの前にセミコロンが挿入されます。
- トークンは、前のトークンから少なくとも 1 つの で区切られます
LineTerminator
。 - トークンは
}
例:
{ 1
2 } 3
に変換されます
{ 1
;2 ;} 3;
はNumericLiteral
1
最初の条件を満たし、後続のトークンは行末記号です。
は2
2 番目の条件を満たし、後続のトークンは です}
。
- トークンの入力ストリームの終わりに達し、パーサーが入力トークン ストリームを 1 つの完全なプログラムとして解析できない場合、入力ストリームの最後にセミコロンが自動的に挿入されます。
例:
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";