自動セミコロン挿入の犠牲になっています。インタープリターは、return ステートメントの後にセミコロンを追加するため、実際には次のようになります。
function A2()
{
return;
// ^ Automatically inserted semicolon
B() &&
C();
}
return
明示的な戻り値のないステートメントがあるため、関数は を返しundefined
ます。
return
仕様のステートメントの文法を見ると、次のようになります。
ReturnStatement :
return
[ここにLineTerminatorはありません]式;
キーワードと式の間の行末記号が許可されていないことがわかりますreturn
(これは「制限された生成」として知られています)。行末記号が検出された場合、自動セミコロン挿入の 3 番目のルールが適用されます。
プログラムが左から右に解析されるときに、文法の一部の生成によって許可されるトークンが検出されたが、生成が制限された生成であり、トークンが注釈の直後の終端または非終端の最初のトークンになる場合制限付きプロダクション内で「[no LineTerminator here]」 (したがって、そのようなトークンは制限付きトークンと呼ばれます) であり、制限付きトークンが前のトークンから少なくとも 1 つの LineTerminator によって分離されている場合、制限付きトークンの前にセミコロンが自動的に挿入されます。 .
非常に長くなるため、A1 関数 a を 1 行で書きたくありません...
ステートメントを複数の行に分割することはできreturn
ますが、改行を配置する場所に注意する必要があります (式の前ではなく、式の中にあることを確認してください)。
function A2()
{
return B() &&
// ^ Invalid to put a semicolon here, so ASI doesn't apply
C();
}