web-dev-qa-db-ja.com

リターンはループを停止しますか?

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

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

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

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

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

123
frenchie

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

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

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

alert(returnMe());
// 1

**注: この他の回答try/catch/finallyの特殊なケースについて、および この回答 を参照してください。forEachループが独自の関数スコープを持つ方法については、含む機能。

163

mostの場合(これを含む)、returnはすぐに終了します。ただし、tryブロックを伴うfinallyブロックに戻りがある場合、finallyブロックは常に実行され、returntryを「オーバーライド」できます。 。

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
55
John Girata

returnステートメントは、ループが関数内にある場合にのみループを停止します。そうしないと、次のエラーが表示されます。

Uncaught SyntaxError: Illegal return statement(…)
7
Damjan Pavlica

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

ループしなかった場合はどうなるか想像してください。ループを続け、そのたびにreturnステートメントを実行しますか?考えたときに値を返すという意味を無効にします。

5
Keldon Alleyne

答えはイエスです。returnステートメントを記述すると、コントロールはすぐに呼び出し元のメソッドに戻ります。 finallyブロックを除き、returnステートメントの後に実行されます。

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

以下のステートメント定義を返します。

Java Docs:

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

MSDNドキュメント:

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

ウィキペディア:

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

1
user1179299

このコードは、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
}
1
PersianIronwood

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

0
Brendon McBain