web-dev-qa-db-ja.com

すべてのJavascript関数は値を返す必要がありますか?

Netbeansを使用して、各機能にプロフェッショナルなコメントを追加しています。したがって、それぞれを/**で始め、Enterを押して、Netbeansが次の機能のデフォルトのコメントスキームを満たせるようにします。

これまでPHP言語にのみこれを使用していましたが、この場合、Netbeansは常にPHP関数が実際に含まれている場合、コメントスキームにのみ@returns {type}部分を追加していましたreturnステートメント。いわゆる「プロシージャ」(値を返さない関数)では、この部分が欠落していました。

今日、私はJavascript関数に対して同じことを試みました。Netbeansは、次の関数が何も返さない場合でも、コメントスキームに@returns {undefined}部分を追加しました。

これは私を混乱させました。 Netbeansは、すべてのJavascript関数が何かを返す必要があることをこのように示唆していますか?私は何をすべきか?そのコメントスキームの部分を無視(または削除)するか、提案(これがまったく提案である場合)に従い、そのような関数の最後にreturn false;を追加しますが、それは私にとっては役に立ちませんか?

90
trejder

短い答えはノーです。

realの答えはイエスです。JSエンジンは、何らかの関数がビジネスを終了したことを通知する必要があります。これは、関数が何かを返すことによって行われます。これが、"finished"の代わりに、関数が"have Return"と言われる理由でもあります。
戻り値を持たないC(++)関数がundefinedを返すと言われている(およびそのシグネチャを反映している)ように、明示的なreturnステートメントを持たない関数はvoidを返します。

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

また、JSでは、ほとんどすべての言語と同様に、関数の戻り値を単純に無視できますが、これは非常に多く行われます。

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

very低レベルでは、リターンは何らかのジャンプに変換されます。関数が本当にnothingを返した場合、次の関数をいつ何時に呼び出すか、またはイベントハンドラーなどを呼び出す方法を知る方法はありません。

要約すると、いいえ、JS関数はコードの範囲内で何も返す必要はありません。ただし、JSエンジンに関する限り、関数alwaysは、returnステートメントを介して明示的に、または暗黙的に、何かを返します。関数が暗黙的に戻る場合、その戻り値は常に未定義になります。

173

いいえ、returnは不要です。

しかしreturnは実際にundefinedを返しません

23
rhapsodyn

すべてのJavascript関数は値を返す必要がありますか?

いいえ、そうではありません。仕様の奥深くでは、これらはすべてわずかに異なることは事実です。

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

...ただし、callingの結果はそれぞれ同じです:undefined。実用的な用語で:

  1. returnを記述する必要はありません。コードの実行を関数の「終わりから落とす」ことができます。
  2. undefinedを返す場合、具体的にはreturn;と書くだけです
  3. 関数を呼び出すとき、実行が最後から落ちたか、return;で終わるか、return undefined;で終わるかを(コードで)知ることはできません。それらはすべてあなたの呼び出しコードとまったく同じに見えます

仕様について:具体的には、「通常の」完了である仕様で、関数の実行が最後から外れた場合。ただし、return;return value;は両方とも、関連付けられた値(undefined)を持つ「戻り」補完であり、(少しずつ)異なります。しかし、違いは 関数を呼び出す のセマンティクスによって排除されます。

...

  1. result。[[Type]]がreturnの場合、NormalCompletion(result。[[Value]])を返します。
  2. ReturnIfAbrupt(result)。
  3. NormalCompletion(undefined)を返します。

したがって、コードで観察できる違いはありません。

4
T.J. Crowder

いいえ、すべての関数に対して何かを返す必要はありません。これはオプションであり、コードロジックの記述方法によります。

2
mohkhan