【问题标题】:Does return stop a loop?return 会停止循环吗?
【发布时间】:2026-01-20 03:45:01
【问题描述】:

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

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

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

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

快速提问:return 会自行停止循环的执行吗?

【问题讨论】:

    标签: javascript loops return


    【解决方案1】:

    是的,return 停止执行并退出函数。 return always** 立即退出其函数,如果它在 for 循环内则不再执行。

    很容易自己验证:

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

    ** 注意:请参阅this other answer 了解try/catch/finally 的特殊情况和this answer 了解forEach 循环如何拥有自己的函数范围不会跳出包含函数。

    【讨论】:

    • > return 总是立即退出其函数,如果它在循环内则不再执行 ...unless it's a forEach loop
    • @o-o 是真的。 return 仍然在函数回调的当前迭代中返回,在它自己的范围内,但不会从整个调用方法 forEach() 中中断。所以它不是从循环本身返回,而是从循环执行的回调中返回。在链接问题的代码示例中,输出为1,2,4,5,因为返回而跳过3
    • 可能红线是return将始终从当前this上下文返回。
    • 在数组上使用 forEach() 或 for() 来“可能”提前终止循环的替代方法是使用 some()。
    • 我知道这对某些人来说是微不足道的,但这很好知道因为你不再需要break然后return
    【解决方案2】:

    是的,一旦return 语句被执行,整个函数就会在此时退出。

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

    【讨论】:

      【解决方案3】:

      大多数情况下(包括这个),return 将立即退出。但是,如果返回位于带有 finally 块的 try 块中,则 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
      

      【讨论】:

      • 惊人的解决方案,是的,在这种情况下,return 将始终执行,使用 try catch
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        return 语句仅在循环位于函数内部时才停止循环(即它终止循环和函数)。否则,你会得到这个错误:

        Uncaught SyntaxError: Illegal return statement(…)
        

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

        【讨论】:

          【解决方案6】:

          答案是肯定的,如果你写了return语句,控件会立即回到调用者方法。 除了 finally 块,它在 return 语句之后执行。

          如果你在 finally 块内返回,finally 也可以覆盖你返回的值。 链接:Try-catch-finally-return clarification

          返回语句定义如下:

          Java 文档:

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

          MSDN 文档:

          return 语句终止函数的执行和 将控制权返回给调用函数。执行恢复在 在调用之后立即调用函数。

          *:

          return 语句导致执行离开当前子例程 并在代码中的点之后立即恢复 子程序被调用,称为它的返回地址。退货地址 通常保存在进程的调用堆栈中,作为 子程序调用的操作。在许多返回语句 语言允许函数指定要传回的返回值 到调用函数的代码。

          【讨论】:

          • 您需要正确链接您使用的来源,并最好格式化引号。
          • 现在看起来还好吗?
          • 感谢语法修复,但仍然没有任何链接,而且您仍然没有使用块引用格式。
          【解决方案7】:

          此代码将在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 each and for...of,继续像我预期的那样工作