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

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

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 将立即退出。但是,如果返回位于带有 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
    【解决方案3】:

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

    Uncaught SyntaxError: Illegal return statement(…)
    

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

    【讨论】:

      【解决方案4】:

      此代码将在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,继续像我预期的那样工作
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        返回语句定义如下:

        Java 文档:

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

        MSDN 文档:

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

        维基百科:

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

        【讨论】:

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

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

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多