42

これがjsfiddleです

完全なコード:

function foo1(){
    return {msg: "hello1"};
}
function foo2(){
    return
    {msg: "hello2"};
}

// output = "foo1 =  {"msg":"hello1"}"
console.log('foo1 = ' , JSON.stringify(foo1())); 

//output = " foo2 =  undefined "
console.log('foo2 = ' , JSON.stringify(foo2()));

2 つの違いは、foo2 では が{msg: 'hello'}独自の新しい行にあることです。パーサーが空白を無視することを期待していましたか?

4

2 に答える 2

41

tl;dr改行により、2 番目の関数で「未定義」が発生しています。JavaScript は多くの場合セミコロンを必要とせず、特定のコンテキストでセミコロンを想定しています (自動セミコロン挿入)。


場合によっては、この ASI 問題を回避するため、および美的理由から、いわゆるgrouping operatorを使用します。たとえば、Hoquetテンプレート DSL (配列を s 式として HTML にコンパイルする) では、HTML 構造を明確に示すように配列をグループ化するのが好きです。

return (
  ["ul"
  , ["li"
    , ["span", {class: "name"}, this.name]
    , ["span", {id: "x"}, "x"]
    ]
  ]
);

これは、私にとっては、

return [
  "ul",
  [
    "li",
    ["span", {class: "name"}, this.name],
    ["span", {id: "x"}, "x"]
  ]
];

そして、それらは同じ数の行になります。しかし、それは美学の問題です。


グループ化演算子は、その中にある式を評価するだけです。これは、通常は関数宣言式に変換する必要がある [すぐに呼び出される関数式]でよく見られます。これにより、すぐに呼び出すことができます (したがって、名前が付けられます)。ただし、おそらくあまり知られていないグループ化演算子の機能は、コンマ区切りの式のリストも使用できることです。

function() {
  return (
    doSideEffects(),
    console.log("this is the second side effect"),
    1 + 1
  );
}

この場合、これらの各式を評価し、最後の式 (1 + 1) のみを返します。

于 2013-08-14T01:51:05.743 に答える
1

受け入れられた回答は正しいようです。

ただし、関数の引数の開始ブラケットで改行を含むリターン行のこのバリアントが機能することがわかりました。

myFunction(){
  return myOtherFucntion(
           myArg);
}

そして、「。」の前に改行があるこの別のバリアント。ドット演算子も機能します:

myFunction(){
  return myObject
           .myObjectFunction();
}

(私の例のスタイル/読みやすさは明らかに少し奇妙ですが、それらが下す結論に注意を払い、適切と思われる独自のスタイルを実行するようにしてください)。

于 2018-05-31T23:40:11.310 に答える