返回会停止循环吗?


156

假设我有一个像这样的循环:

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

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

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

快速问题:return停止循环本身及其执行吗?

Answers:


205

是的,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

在数组上使用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


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
}

谢谢,这对我有很大帮助,我正在使用节点,返回的收益打破了我的期望,因为……的继续工作就像我期望的那样
veroneseComS

5

是的,一旦return执行了该语句,就将在此时退出整个功能。

试想一下,如果不执行并继续循环并return每次执行该语句,将会发生什么情况?当您考虑它时,返回值的含义将无效。


1

答案是肯定的,如果您编写return语句,则控件将立即返回到调用方方法。除了finally块之外,该块在return语句之后执行。

如果您在finally块内部返回,finally也可以覆盖您返回的值。链接:尝试捕获最终返回说明

返回声明定义如下:

Java文件:

return语句可用于从控制流块中分支出来并退出方法

MSDN文档:

return语句终止函数的执行并将控制权返回给调用函数。在紧接调用之后的那一点,将在调用函数中恢复执行。

维基百科:

return语句使执行离开当前子例程,并在该子例程被调用后立即在代码中的点(即其返回地址)处继续执行。作为进行子例程调用的操作的一部分,通常将返回地址保存在进程的调用堆栈中。使用多种语言的Return语句允许函数指定返回值,该返回值将传递回调用该函数的代码。


您需要正确链接使用的源,并且理想情况下还要设置引号的格式。
内森·塔吉

现在看起来还好吗?
user1179299

我感谢语法修复程序,但是仍然没有任何链接,并且您仍然没有使用blockquote格式。
内森·塔吉

0

“ return”确实退出了该函数,但是如果您想返回大量数据,则可以将其存储在数组中,然后将其返回,而不是尝试在循环中逐一返回每个数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.