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


99

私はNetbeansを使用して、各関数にプロのようなコメントを追加しています。それで、それぞれを最初に開始し/**、次にを押しEnterて、Netbeansに以下の機能のデフォルトのコメントスキームを実行させます。

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

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

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


6
戻り値が指定されていない場合、JavaScriptはを返しundefinedます。多くの言語では、最後のステートメントの結果が返されます(より有用なIMO)。これらは暗黙のリターンと呼ばれます
Zaz

これはあなたの質問に答えますか?JavaScript関数で何かを返す必要がありますか?
cOborski

回答:


189

短い答えはノーです。

本当の答えはイエスです:JSエンジンは、一部の機能は何かを返す関数によって行われる事業を、終了したことを通知する必要があります。これも、「終了した」の代わりに、関数が「戻った」と言われる理由でもあります。
明示的なreturnステートメントのundefinedない関数は、を返します。たとえば、戻り値のないC(++)関数は、次のように(そしてそのシグネチャはこれを反映しています)と返され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

一部では、非常に低いレベル、リターンがジャンプのいくつかの並べ替えに翻訳されています。関数が本当に何も返さなかった場合、次の関数を呼び出すのに何をいつ呼び出すのか、またはイベントハンドラーなどを呼び出す方法を知る方法はありません。

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


5
C ++(またはC)が「ボイドを返す」とは思いません。「void」タグは、何も返さないことを示します。しかし、それはマイナーなポイントであり、尋ねられた質問とは何の関係もありません。
Jay

2
それはしません、実際に戻るvoidことは何も返しませんが、その署名はを介してこれを反映して、void戻り値の型。
エリアスヴァンウーテゲム2015年

明示的なリターンと暗黙的なリターンにはパフォーマンス上のメリットがありますか?
2015年

@ 4m1r:わからない、おそらくエンジンに依存します。パフォーマンスの違いがある場合、それは無視できる可能性が高いです。暗黙のリターンvs return;は、おそらく早期に戻る必要がある場合にのみ役立ちます。異なる値に解決されるreturn undefined;場合、書き込みは異なる結果を生成する可能性がありundefinedます。ほとんど(すべてではないにしても)のブラウザーは、未定義を再割り当てしようとするとエラーをスローしますが、理論的には、node.jsを使用した例が
Elias Van Ootegem

1
@SebastianLasse:私はvoid他の言語(Cなど)で言及していました。そこではのような関数を持つvoid do_someting(int *arg)ことができますが、型を持つ変数を持つことはできませんvoid。Cでは、void実際には型ではないため、これらの関数は何も返さず、ジャンプするだけです
エリアスヴァンウーテゲム

25

いいえ、返品は必要ありません。

しかし、誰リターンは、実際には戻りませんundefined


6

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

いいえ、ありません。仕様の深いところでは、これらはすべてわずかに異なります。

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

...しかし、それぞれを呼び出した結果は同じですundefined。だから実用的な言葉で:

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

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

...

  1. 場合結果。[タイプ]でありreturn、NormalCompletion(リターン結果を [[値]])。
  2. ReturnIfAbrupt(結果)。
  3. NormalCompletion(undefined)を返します。

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


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.