`forEach` 函数中的 `return` 关键字是什么意思?

267

$('button').click(function () {
   [1, 2, 3, 4, 5].forEach(function (n) {
      if (n == 3) {
         // it should break out here and doesn't alert anything after
         return false
      }
      alert(n)      
   })
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>Click me</button>

我的问题是:为什么即使调用了return,它仍然会提示下一个数字?就像:忽略下面的代码,继续处理下一个元素

$('button').click(function(){}) 是什么意思? - PDKnight
1
你可以使用 if(n>=3){ return false} 来中断它。 - Bhojendra Rauniyar
1
return 不会中断循环,只有 break 才能做到! - Bekim Bacaj
有趣的是,如果你改变第二行并先将数组分配给一个变量,例如:var r = [1, 2, 3, 4, 5]; r.forEach(function (n) {,那么示例的行为会大不相同。在这种情况下,它将跳出循环。 - w. Patrick Gale
2个回答

377

65
使用forEach并抛出错误来停止迭代是非常糟糕的做法,也是一种过度设计。在您的情况下,您并不真正希望迭代整个数组(即使用forEach),而是希望运行到某个语句被满足为止。您应该使用简单的循环语句(如whileforfor indo while)。 - Ronen Cypis
10
我同意@RonenCypis的观点...并建议您使用some() - squaleLis
2
每个人都有一个计划,直到 new Array(5) 出现为止... (new Array(5)).every(e => e === "也许 for 循环和 break 并不是那么糟糕的想法?") 由于稀疏数组产生出乎意料的结果。 - yurisich
6
这似乎没有回答在forEach循环中实际上return语句的作用是什么,但我猜下一个回答可能会有帮助。 - MattTreichel

58
return语句会停止当前函数的执行,但循环仍将继续,这样你就可以获取“下一个”跳过if并弹出4...的项目... 如果你需要停止循环,你应该使用简单的for循环,像这样:
$('button').click(function () {
   var arr = [1, 2, 3, 4, 5];
   for(var i = 0; i < arr.length; i++) {
     var n = arr[i]; 
     if (n == 3) {
         break;
      }
      alert(n);
   })
})

您可以在这里阅读有关JS中断和继续的更多信息:http://www.w3schools.com/js/js_break.asp


4
什么意思?我是为了易于理解而这样写的... 也许代码可以再缩短一点,但它确切地得到了你想要的结果,而不像其他答案中对数组进行额外迭代。 - Ronen Cypis
你需要先声明数组。你想在数组长度内使用循环。你需要一个索引来访问数组元素......有这么多事情要做 :) 这就是我的意思。 - Tân
5
在你的示例中,你已经声明了数组,我只是添加了一个引用(var arr)以便轻松访问。您还可以将“for”循环更改为“for in”或“while”... 所有这些选项都比创建新函数并在其他示例中抛出错误要好得多,并且速度更快。无论如何,祝你好运 :-) - Ronen Cypis
5
这个答案解决了我的疑问,即在forEach循环中是否有时仍然有必要使用return关键字,当你不想在特定条件下执行剩余的循环逻辑时,使用return是非常合理的! - GrayedFox
原始代码在1、2、4、5上有警报,漏掉了3。- 2022年2月10日 - Firefox 97。 - JoePythonKing

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