returnとreturn()の違いは何ですか?


97
function a() { return 1; }
function b() { return(1); }

上記のコードをChromeのコンソールでテストしたところ、どちらも返されました1

function c() { return "1"; }
function d() { return("1"); }

上記のコードもテストしましたが、両方の関数が返されました"1"

だから、使用しての違いは何であるreturnとはreturn()


21
ここでの答えはまたに適用されますvoid(x)typeof(x)
ポールS.

3
@PaulS。— undefinedのvoid(0)省略形であることになっているため、常に困惑していました。それで、それが速記であるならば、なぜ不必要な文字を含むのですか ;-)
RobG 2014

1
@RobG私はそれがキャリーオーバーからだと思うのPythonと、実際にあなたが事業者を含めたい特別な場合のために有用である可能性がvoid i = 1; // ReferenceErrorvoid (i = 1); // undefined
ポールS.

1
この質問は、C#に適用される質問です。stackoverflow.com
Eric Lippert

回答:


177

間と同じ

var i = 1 + 1;

そして

var i = (1 + 1);

つまり、何もありません。括弧は、式で評価順序に影響を与えることが許可されているため許可されていますが、例ではそれらは不必要です。

returnは関数ではなくステートメントです。これは、のような他の単純な制御フローステートメントと構文的に類似してbreakおりcontinue、括弧も使用しません。


12
return文は、式が続くことができます。戻り値は関数内にある必要があるため、関数は式の値を返します。値がない場合はundefinedを返します。
RobG 2014

37
@ chris97ong:returnは関数ではありません。
RemcoGerlich 2014

34
あなたが作った場合はreturn、関数に、どのようにそれから値を返すでしょうか?
dan04 14

4
これは素晴らしい例での素晴らしい答えですが、この質問につながったのは誤解の根本であることを考えると、「リターン」は主な答えの関数ではないことを付け加えた方がいいと思います。
BiscuitBaker 14

3
@BiscuitBaker:少し追加しました。この短い回答を書き留めたとき、50以上の賛成票が得られると思っていませんでした...
RemcoGerlich 14

21

違いはありません。

returnは関数呼び出しではなく、言語ステートメントです。括弧を使って行っているのは、単に戻り値をグループ化して、評価できるようにすることだけです。たとえば、次のように書くことができます。

return (x == 0);

この場合、ステートメントの値を返しますx == 0。これは、ブール値を返すtruefalse、の値に依存しますx


6
returnは、 returnステートメントの開始を示すキーワードです。
RobG 2014

1
returnステートメントの評価には「グループ化」は必要ありません。したがって、いずれの場合もブール値の戻りが発生します。
ウルフ14

18

実際には、ここでの優先順位()が高いため、最初に評価されます。

ここでは、最初("1")に次の方法で評価されます。

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

したがって、上記のステートメントは次と同等です。

return "1";

視覚的に見る:

悪質な

したがって、基本的には機能に違いはありませんが、2番目のものは最初にブラケットを解決するため、わずかに遅いかもしれません。


2
そうでない場合に、「2番目のものは無視できるほど少し遅いかもしれない」という完全に検証されていないアサーションを作成するのはなぜですか?

9

全く違いはありません。JS(ECMAScript)仕様のreturn文を見てみましょう。他の多くのものの中で、それはあなたに言っています:

return [ここにはLineTerminatorはありません]式;

に式を提供できますreturn。式はhelloMath.abs(x)yourCustomFunc(7)、または2番目のケースでは、これは可能1(1)1評価後の表現は、本当に奇妙なもの(1)と同じである(((((1))))))か、同じか、さらには奇妙なものである(+(!(+(!1))))


1
公式リファレンスは+1。ページごとのリファレンスはありませんか?-1ページのHTMLが非常に長く読み込まれます。
ウルフ14

@ウルフ私はそのようなものを見つけていません。ここでは別のものであるが、それはまた、1つのページでpeople.mozilla.org/~jorendorff/...
サルバドール・ダリ

はい、悲しいです。私も成功しないでしょう。引用をreturnステートメントの構文全体に拡張するのはどうですか?
ウルフ

9

違いはなく、括弧はオプションです。MSDNを参照してください。

return[(][expression][)];

オプションの式引数は、関数から返される値です。省略した場合、関数は値を返しません。

関数の実行を停止して式の値を返すには、returnステートメントを使用します。式が省略されている場合、または関数内からreturnステートメントが実行されていない場合、現在の関数を呼び出した式には値undefinedが割り当てられます。


8
MSだけが、returnステートメントでグループ化を「オプション」にすると考えます。それらは、他の表現や文法の他の多くの部分と同じように「オプション」です。
RobG 2014

@RobG:しかし、明らかに、彼らはreturn声明で尋ねられる可能性がはるかに高いです。:P MSはおそらくJS noobsからの質問に答えるのに飽きたでしょう。
cHao 2014

2
M $の説明は正しくありません。()、return文の一部ではありません。
Salman A 14

4
「読者には違いがあります。」はい、MSDN仕様は誤ってそれを意味しreturn (expressionreturn expression)合法です。
ジムバルター2014

2
@JimBalter return ()return (そしてreturn ):P
ポール・

9

returnある文は、 return文を開始キーワードない機能を。

前述のように、余分な括弧は評価順序に影響しますが、という関数を「実行」するためには使用されませんreturn。これが、これらの行が問題なく機能する理由です。

return (1);
var a = (1);

実際には、次の行と同じです。

return 1;
var a = 1;

その理由は、return()構文エラーが正確な理由のためであるスロー次の行は、エラースロー(比較のために含まreturn文を):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

補足として、returnその後に何も含まれていない場合は、戻りたいと見なしますundefined
IQAndreas 14

@Wolf式はオプションであるためreturn、それ自体がreturnステートメントです。
ポール、

6

人間には大きな違いがあり、Javascriptエンジンには違いがありません。

return 1ある文で、我々はすぐに1の値を与える機能を終了する必要があることを宣言するには。

return(1)Javascriptで括弧の外側にスペースを挿入する義務がないという、ばかばかしい慣習による関数呼び出しを装った同じステートメントです。プロダクションシステムでこのようなコードを使用する場合、メンテナはreturn()、コードベースのどこかに本当に機能があるか、またはreturnキーワードの意味がわからないかを判断するためにしばらく時間を費やした後、棒と松明を持ってオフィスにやってきます。

他の多くの人がすでに正しく言っているように、括弧は数値のリテラルより優先順位の高い「グループ」以外には何もしません1


3
「人間には大きな違いがあります」-有能なものではありません。「関数呼び出しを装った同じステートメント」- return関数はありません。「Javascriptで括弧の外側にスペースを挿入する義務がないというばかげた慣習」-ほとんどの言語では必要ありません。この馬鹿げたことを馬鹿げたことです。「どんなメンテナーもステークやトーチを持ってあなたのオフィスに来るでしょう」-有能な人はそうしません。return(1)悪い習慣ですが、そのようなことに腹を立てる人々は、リソースを浪費し、悪い雰囲気を作り出しています。
ジムバルター2014

@JimBalter "有能なものではない"-ha!「それを必要とする言語はほとんどない」-それが私が「慣習」と言った理由です。ばかばかしい場合は、「ばかばかしい」と呼ばれます。「return関数はありません」-インタプリタが関数を名前で登録することを禁止しているという事実returnは、コードの読者が最初に正気を疑わないようにするのを助けないので、このコードは無駄です。return(1)単に「練習不足」ではなく、誰かが何をしているか知らないという危険な兆候です!
ヒジャール

2
つまり、「義務的」の意味がわからないか、主張を変更しているのです。
ジムバルター2014

私はあなたの最後の文章の真実を疑います。return(このキーワードを持っていることがわかっているすべての言語で)優先順位が最も低くなっています。したがって、オプションの式が存在する場合、常に最初に評価されます。
ウルフ

4

returnステートメントでは、式囲む括弧がすでに組み込まれています。

JavaScriptでは、他の多くの言語(C、C ++、Java、Pythonなど)と同様に、returnステートメントにはキーワードreturnと(オプションの)式の2つの部分があります。したがって、いずれの場合でもreturnキーワードに続くものはすべて最初に式として評価され、その後、コントロールを呼び出し元に戻すことにより、returnステートメントが「実行」されます。

かっこを使用するかどうかは、スタイルの問題ですが、ほとんどのスタイルガイドでは、質問で引用されているような些細なケースでは括弧を禁止しています。

後の補遺

括弧の有無にかかわらず、オプションの式をの後ろreturn、つまり同じ行に配置することを忘れないでください。JavaScriptでの実際の落とし穴return、その後に改行を追加することです。

function test() {
  return 
  1;
}

...上記のtest関数が返されるためundefinedです。


1

括弧を追加することにより、参照用に、JavaScriptが復帰後に書き込まれた複数のステートメントの前にセミコロンを挿入しないようにしました:-https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

return a + b;

に変換されます

return; a + b;

ASIによる。

コンソールは「returnステートメントの後に到達不能コード」を警告します。この問題を回避するには(ASIを防ぐため)、括弧を使用します。

return ( a + b );
コピー元のコード:-https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


これは完全に正しいことであり、そのように複雑な表現に対して意味があります。ただしさらに明確にするために、最初の文の同じ行またはreturnの直後に追加する必要があります。反対票はこれの誤解から来ていると思います。
ウルフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.