4

多変量条件を評価するためのjavascript関数を作成しているときに、Javascriptのパーサーエラーのように見えるものに出くわしました。何かを忘れているのか、それとも適切な行動なのか教えてください。

私の関数では、次ANDのようないくつかの変数の結果を返します。

return
// a comment, for kicks
a1 && a2
&&
b1 && b2
&&
// another comment
c1 && c2
&&
d1 && d2
;

ただし、これらの変数のすべてに明示的な値が含まれている場合でも、関数は期待されるのではなくtrue戻ります。undefinedtrue

この式を返すいくつかのバリエーションを試しましたが、次のことがわかりました。

  1. 複数行の式-失敗
  2. 1行の式-動作します
  3. 表現をparethesesでラッピング-動作します
  4. 複数行の式を変数に設定してから、変数を返す-動作します

実例を参照してください:http://jsfiddle.net/drzaus/38DgX/

なぜこれが起こるのか誰かが説明できますか?

4

3 に答える 3

7

あなたが遭遇しているのは、「セミコロン挿入」として知られているJavascriptの奇妙な振る舞いです。簡単に言うと、行の終わりが構文エラーを発生させずにステートメントの終わりとして解釈できる場合、Javascriptはそうします。ステートメントが修飾された後の改行return-これが発生しないようにするために、次のように戻り値を括弧で囲むことができます。

return (
  a1 && a2
  ...
  d1 && d2
);

詳細(および仕様からの引用)は次の場所にあります:セミコロン挿入の理解の問題

于 2012-08-15T15:19:20.277 に答える
6

これは正しい動作です。関数return;を入れると、が返されundefinedます。あなたの例では、後の改行returnにより、パーサーはこれがステートメントの終わりであると見なすため、を返しますundefined

于 2012-08-15T15:17:52.677 に答える
2

Aha-関連リンクのフーレイ: JavaScript空白構文エラー

パーサーは後に改行を認識しreturn、自動的にセミコロンとして処理するようです。それが機能する場合、それが実際には複数行の句であるか、単一行にある(したがって自動挿入を否定する)ことをパーサーに示す構文解析があるか、変数の場合はパーサーによって異なる方法で処理されます。

于 2012-08-15T15:18:11.543 に答える