次のようなループがあるとします。
for (var i = 0; i < SomeArrayOfObject.length; i++) {
if (SomeArray[i].SomeValue === SomeCondition) {
var SomeVar = SomeArray[i].SomeProperty;
return SomeVar;
}
}
簡単な質問: はreturn
ループの実行自体を停止しますか?
次のようなループがあるとします。
for (var i = 0; i < SomeArrayOfObject.length; i++) {
if (SomeArray[i].SomeValue === SomeCondition) {
var SomeVar = SomeArray[i].SomeProperty;
return SomeVar;
}
}
簡単な質問: はreturn
ループの実行自体を停止しますか?
はい、return
実行を停止して関数を終了します。return
always** はその関数をすぐに終了し、for ループ内にある場合はそれ以上実行しません。
自分で簡単に確認できます。
function returnMe() {
for (var i = 0; i < 2; i++) {
if (i === 1) return i;
}
}
console.log(returnMe());
** 注:の特殊なケースについてはこの他の回答を参照してください。また、forEach ループに独自の関数スコープがあり、それを含む関数から抜け出せない方法についてはtry/catch/finally
、この回答を参照してください。
ほとんどの場合 (これを含む)、すぐ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
ステートメントはreturn
、ループが関数内にある場合にのみループを停止します (つまり、ループと関数の両方を終了します)。そうしないと、次のエラーが発生します。
Uncaught SyntaxError: Illegal return statement(…)
ループを終了するには、 を使用する必要がありますbreak
。
はい、return
ステートメントが実行されると、その時点で関数全体が終了します。
return
それが行われず、ループを続け、そのステートメントを毎回実行するとどうなるか想像してみてください。考えてみると、値を返すという意味が無効になります。
「return」は関数を終了しますが、大量のデータを返したい場合は、ループ内で各データを 1 つずつ返すのではなく、配列に格納してから返すことができます。