ChatGPT解决这个技术问题 Extra ChatGPT

return 会停止循环吗?

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

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

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

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

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


D
Dane Brouwer

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

自己很容易验证:

函数 returnMe() { for (var i = 0; i < 2; i++) { if (i === 1) 返回 i; } } console.log(returnMe());

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


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

大多数 情况下(包括这种情况),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
P
PersianIronwood

此代码将在 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,继续像我预期的那样工作
D
Damian Pavlica

return 语句仅在它位于函数内部时才停止循环(即它终止循环和函数)。否则,您将收到此错误:

Uncaught SyntaxError: Illegal return statement(…)

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


K
Keldon Alleyne

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

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


u
user1179299

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

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

返回语句定义如下:

Java 文档:

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

MSDN 文档:

return 语句终止函数的执行并将控制权返回给调用函数。调用函数在调用之后的点处继续执行。

维基百科:

return 语句会导致执行离开当前子例程,并在代码中调用子例程之后的位置(称为其返回地址)处继续执行。返回地址通常保存在进程的调用堆栈中,作为进行子例程调用的操作的一部分。许多语言中的返回语句允许函数指定返回值以传回调用该函数的代码。


您需要正确链接您使用的来源,并理想地格式化引号。
现在看起来还好吗?
我很欣赏语法修复,但仍然没有任何链接,而且您仍然没有使用块引用格式。
B
Brendon McBain

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