returnはループを停止しますか?


157

次のようなループがあるとします。

for (var i = 0; i < SomeArrayOfObject.length; i++) {

  if (SomeArray[i].SomeValue === SomeCondition) {

     var SomeVar = SomeArray[i].SomeProperty;
     return SomeVar;
  }
}

簡単な質問:returnループ自体の実行は停止しますか?

回答:


206

はい、return実行を停止して関数を終了します。returnalways **は関数をすぐに終了し、forループ内にある場合はそれ以上実行しません。

自分で簡単に確認できます:

function returnMe() {
  for (var i=0; i<2; i++) {
    if (i === 1) return i;
  }
}

alert(returnMe());
// 1

**注:参照してください。この他の回答の特殊なケースについてtry/catch/finally、この答えはforEachは独自の関数スコープが含む関数から抜け出していないだろうしているループ方法についてを。


25
> returnは常に関数をすぐに終了し、ループ内にある場合はそれ以上実行されません... forEachループでない限り
oo

9
@oo真実のようです。returnそれでも、関数コールバックの現在の反復から、独自のスコープで戻りますが、呼び出しメソッド全体から中断することは期待されていませんforEach()。つまり、ループ自体からは戻りませんが、ループが実行するコールバックから戻ります。リンクされた質問のコード例では、リターンのために出力がを1,2,4,5スキップして3います。
Michael Berkowski

たぶん赤いスレッドは、return常に現在のthisコンテキストから戻るということです。
oo 2016年

配列でforEach()またはfor()を「潜在的に」早期ループ終了に使用する代わりに、some()を使用します。
AnBisw

1
私は、これは一部の人のために簡単ですが、知っているあなたは、もはや必要があるため、これはあまり良く知られていませんbreakし、その後return
NoName

60

最も(これを含む)の場合、return即座に終了します。リターンがである場合は、try付属の持つブロックfinallyのブロック、finally常に実行して、「上書き」することができますreturnの中でtry

function foo() {
    try {
        for (var i = 0; i < 10; i++) {
            if (i % 3 == 0) {
                return i; // This executes once
            }
        }
    } finally {
        return 42; // But this still executes
    }
}

console.log(foo()); // Prints 42

8

return声明は、それが関数内だ場合にのみ、ループを停止します。そうしないと、次のエラーが発生します。

Uncaught SyntaxError: Illegal return statement(…)

6

このコードは、ループの最初の反復後にループを終了しfor ofます。

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];
for (const iterator of objc) {
  if (iterator.name == 2) {
    return;
  }
  console.log(iterator.name);// 1
}

以下のコードは、条件にジャンプしてfor ofループを続行します。

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];

for (const iterator of objc) {
  if (iterator.name == 2) {
    continue;
  }
  console.log(iterator.name); // 1  , 3
}

おかげで、これは非常に役立ちます。ノードを使用していて、戻り値がfor、for、for、of ... ofを壊しています
。continueは

5

はい、一度 returnステートメントが実行されると、その時点で関数全体が終了します。

ループせずにループを続け、そのreturnステートメントを毎回実行するとどうなるか想像してみてください。考えたときに値を返すという意味が無効になります。


1

答えは「はい」です。returnステートメントを作成すると、コントロールは呼び出し元のメソッドにすぐに戻ります。returnステートメントの後に実行されるfinallyブロックを除いて。

また、finallyブロックの内部に戻った場合、最後に、返された値をオーバーライドすることもできます。リンク:Try-catch-finally-returnの説明

次のようにステートメント定義を返す:

Javaドキュメント:

returnステートメントを使用して、制御フローブロックから分岐し、メソッドを終了できます。

MSDNドキュメント:

returnステートメントは、関数の実行を終了し、呼び出し元の関数に制御を返します。呼び出し直後の時点で、呼び出し元の関数の実行が再開されます。

ウィキペディア:

returnステートメントを使用すると、実行は現在のサブルーチンを終了し、サブルーチンが呼び出された直後のコード内のポイント(復帰アドレス)から再開されます。戻りアドレスは、通常はプロセスの呼び出しスタックに、サブルーチン呼び出しを行う操作の一部として保存されます。多くの言語のReturnステートメントを使用すると、関数は、その関数を呼び出したコードに返される戻り値を指定できます。


使用したソースを適切にリンクし、理想的には引用符もフォーマットする必要があります。
ネイサンタギー

今は元気ですか?
user1179299

文法の修正に感謝しますが、リンクはまだなく、ブロッククォートのフォーマットも使用していません。
Nathan Tuggy

0

"return"は関数を終了しますが、大量のデータを返したい場合は、ループにデータを1つずつ返すのではなく、配列に格納してから返すことができます。

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