12

どこにあるのか思い出せませんが、最近、JavaScriptではAllmanよりも1TBSの方が好ましいとユーザーが言って、AllmanはJavaScriptに危険な影響を与えるというコメントを渡しました。

それは有効な声明でしたか?もしそうなら、なぜですか?

4

5 に答える 5

21

returnそれの後に持つことはできませんLineTerminator

return
{


};

(オブジェクトを返す)ではなくreturn;(return )として扱われますundefinedreturn {};

詳細については、ルールを参照してくださいAutomatic Semicolon Insertion (ASI)

于 2012-06-28T14:55:55.937 に答える
3

これは有効なステートメントです。

JavaScriptのエンジンには、必要に応じて行の戻りにセミコロンを挿入するASI(自動セミコロン挿入)と呼ばれるものがあるためです。「必要に応じて」はあいまいです。動作する場合と動作しない場合があります。ルールを参照してください。

だから、他の答えで言ったように:

return
{
};

// Is read by the JavaScript engine, after ASI, as:
return; // returns undefined
{ // so this is not even executed
};

したがって、returnステートメントにはお勧めしません。

ただし、ガイドラインで関数宣言にAllmanスタイルが推奨されている場合は、まったく問題ありません。私はそうする人を知っています。

于 2012-06-28T15:00:51.843 に答える
2

声明次第だと思います。たとえば、左中括弧が改行にある場合、returnステートメントが壊れている可能性があります。 詳細はこちら

于 2012-06-28T14:58:47.267 に答える
2
return {
    a: "A",
    b: "B"
};

// vs.

return // Semicolon automatically inserted here! Uh oh!
{
    a: "A",
    b: "B"
}
于 2012-06-28T14:58:56.533 に答える
0

returnキーワードと。を含む1つの特殊なケースを覚えている限り、AllmanまたはAllman-8スタイルを問題なく使用できますthrow

returnオブジェクトリテラルをキーワードまたはラインフィードで分離するthrowことは、JavaScriptでは機能しません。これはASIルールに特別な例外throwreturnステートメントがあるためです。

  1. プログラムが左から右に解析されるときに、文法の一部の生成で許可されるトークンが検出されたが、生成は制限された生成であり、そのトークンは、注釈の直後の終端記号または非終端記号の最初のトークンになります。制限付きプロダクション内の「<strong>[ここにLineTerminatorはありません]」(したがって、このようなトークンは制限付きトークンと呼ばれます)、 制限付きトークンは少なくとも1つのLineTerminatorによって前のトークンから分離され、セミコロンが前に自動的に挿入されます制限されたトークン。

以下は、文法で制限されている唯一
の生成です。 [...]
ReturnStatement
return [ここにLineTerminatorはありません] ;
ThrowStatement
throw [ここにLineTerminatorはありません] ;

(他にも制限されたプロダクションがありますが、それらは中括弧をサポートしていないため、Allmanスタイルにとって重要ではありません。)

実際には、これは期待どおりには機能しません

return
{
        status: "successful",
        user:
        {
               id: "9abf38a3-c2f5-4159-a1be-0eccbc1b2349",
               label: "John Doe",
        },
};

として解釈されるため(リターン後のセミコロンに注意してください!)

return;
{
        status: "successful",
        user:
        {
               id: "9abf38a3-c2f5-4159-a1be-0eccbc1b2349",
               label: "John Doe",
        },
};

したがって、構文を使用する必要があります

const response =
{
        status: "successful",
        user:
        {
               id: "9abf38a3-c2f5-4159-a1be-0eccbc1b2349",
               label: "John Doe",
        },
};
return response;

また

return {
        status: "successful",
        user:
        {
               id: "9abf38a3-c2f5-4159-a1be-0eccbc1b2349",
               label: "John Doe",
        },
};

代わりは。

個人的には、返された構造に名前を付ける方が読みやすいと思うので、それを使用します。また、どこでもAllman-8を使用しています。これは、実際には、8つのスペース幅のタブ文字を使用し、1つ以上のスペースではなく1つのタブ文字ですべてをインデントすることを意味します。

理論的には、誰かが書くこともできます

throw
{
        status: "error",
        code: 12,
        details: localvar,
};

throw上記のASI規則により、キーワードの直後にセミコロンが挿入されるため、これも失敗します。現実の世界では、誰もが書いているようthrow new ...ですthrow localvar

これらの例外の履歴はわかりませんが、この事故に依存する既存の実世界のコードのために、これ以上修正できない歴史的な事故であると推測できます。この自動セミコロンが実際に有益である構造は見当たらないので、これは歴史的な仕様の単なるバグだと思います。(次のコード、returnまたはthrowオブジェクトリテラルで合理的に開始できないため、挿入されたセミコロンでは機能しません。)

于 2022-02-02T10:25:35.900 に答える