3

私はこれらの機能を持っています:

function A1()
{
    return B() && C();
}

function A2()
{
    return
        B() && 
        C();
}

function B()
{
    return true;
}

function C()
{
    return true;
}

A1 を呼び出すと true が返されますが、A2 は undefined を返します。A1 と A2 の唯一の違いは空白です。何が起こっている?私の実際のコードでは、A1 関数 a を 1 行で書きたくありません。

4

2 に答える 2

7

自動セミコロン挿入の犠牲になっています。インタープリターは、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();
}
于 2013-07-02T09:47:38.500 に答える
1
return (
    B() && 
    C()
);

同様に動作します

于 2013-07-02T10:00:43.880 に答える