return 会停止循环吗?

Posted

技术标签:

【中文标题】return 会停止循环吗?【英文标题】:Does return stop a loop? 【发布时间】: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 本身会停止循环的执行吗?

【问题讨论】:

【参考方案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”确实退出了函数,但是如果你想返回大量数据,你可以将它存储在一个数组中然后返回它,而不是尝试在循环中一个一个地返回每个数据。

【讨论】:

以上是关于return 会停止循环吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python怎么return后让循环继续运行?

Python怎么return后让循环继续运行?

foreach中使用return失效

流程控制之 break ,continue,return的区别

关于[JS] forEach循环return无法跳出的踩坑和解决方案

前端面试 JavaScript— forEach中return有效果吗?如何中断forEach循环?