返回语句会停止循环吗?

249

如果我有以下的for循环:


    for (var i = 0; i < SomeArrayOfObject.length; i++) {
    
      if (SomeArray[i].SomeValue === SomeCondition) {

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

< p > return语句会停止函数的执行吗?

7个回答

330

是的,无论何时函数的控制流遇到return语句都会结束。

以下示例演示了return语句如何结束函数的执行。

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

console.log(returnMe());

注意: 有关try - catch - finally的特殊情况,请参见这个答案,有关forEach回调函数具有自己的函数作用域,因此不会中断包含函数,请参见此回答


54
如果return语句位于循环内部,它会立即退出函数并停止进一步执行。但是,如果该循环是forEach循环,则不适用此规则。 - o-o
15
有点道理。return仍然会从当前函数回调的迭代中返回,在其自己的范围内,但不应该打破整个调用方法forEach()。因此,它不是从_循环本身_返回,而是从循环执行的回调函数返回。在链接问题的代码示例中,由于存在return,输出为“1,2,4,5”,跳过了数字3 - Michael Berkowski
1
也许红线是return将始终从当前的this上下文返回。 - o-o
1
在数组上进行“可能”提前循环终止的替代方法是使用some(),而不是使用forEach()或for()。 - Anjan Biswas
2
我知道对于一些人来说这很简单,但是这很好知道,因为你不再需要使用break然后再使用return了。 - NoName
1
forEach不是一个循环 - 它是一个具有相当清晰定义的数组方法,因此它并不真正违反return退出循环规则。 - Drenai

88

大多数情况下(包括此案例),return将立即退出。但是,如果在try块中有一个伴随的finally块,则finally始终会执行,并且可以“覆盖”try中的return

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

1
惊人的解决方案,是的,在那种情况下,返回语句总是会执行,因此请使用try catch。 - Arghya Chowdhury

25

此代码将在 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
}

谢谢,这对我很有帮助。我正在使用Node,返回值打破了我的for、for each和for...of循环。continue的效果正如我所期望的那样。 - veroneseComS

17
< p> return 语句仅在函数内部停止循环(即终止循环和函数)。否则,您将得到此错误:


Uncaught SyntaxError: Illegal return statement(…)

要终止循环,您应该使用break


6
是的,一旦执行了return语句,整个函数就会在那一点上退出。
想象一下,如果它没有退出并继续循环,并每次执行return语句会发生什么?这会使它返回值的意义失效。

2
答案是肯定的,如果你编写了 return 语句,控制权会立即返回到调用方法。但 finally 块除外,它会在 return 语句之后执行。
并且如果你在 finally 块中使用 return 语句,它也可以覆盖你已经返回的值。 链接:Try-catch-finally-return clarification 根据Java文档: 返回语句可以用于跳出控制流块并退出该方法。
根据MSDN文档: 返回语句终止函数的执行并将控制返回给调用函数。执行在调用函数中在调用点之后恢复。
维基百科:
一个返回语句会导致程序离开当前子程序并在调用该子程序的代码中立即恢复执行,称为其返回地址。通常将返回地址保存在进程的调用堆栈中作为进行子程序调用的操作的一部分。许多语言中的返回语句允许函数指定要传回给调用函数的代码的返回值。

您需要正确链接所使用的源,并最好格式化引用。 - Nathan Tuggy
现在看起来还可以吗? - user1179299
我感谢您对语法的修正,但仍然没有链接,并且您仍未使用引用格式。 - Nathan Tuggy

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接