ForEach
循环是否允许我们使用break
和continue
?
我尝试过使用这两种方法,但收到了错误:
Illegal break/continue statement
如果确实允许,我该如何使用它们?
答案 0 :(得分:13)
不,它不会,因为您将回调作为返回传递,它作为普通函数执行。
让我说清楚:
var arr = [1,2,3];
arr.forEach(function(i) {
console.log(i);
});
// is like
var cb = function(i) {
console.log(i);
// would "break" here do anything?
// would "continue" here do anything?
// of course not.
}
for(var j = 0; j < arr.length; j++) {
cb(arr[j]);
}
所有forEach都会调用你重复给它的真实的,实际的函数,忽略它是如何退出的,然后再次在下一个元素上调用它。
在该回调函数中,如果您返回,则在continue
的情况下偶然会像forEach
一样工作。因为该函数的其余部分将不会执行该时间,并且将再次调用它。没有break.
Ruby支持这种灵活性,使用块/ proc而不是methods / lambdas。
注意:无法停止或中断forEach循环。解决方案是使用Array.every或Array.some。见下面的例子。
every
和some
与forEach
完全相同,只是它们注意回调的返回值。 every
会打破假名值,some
会突破真值,因为它们会短路。它们与&&
和||
完全相似。 &&
测试每个表达式是否真实,||
测试是否某些,这应该可以帮助您记住短路是如何与{{{ 1}}和every
。如有疑问,请试试。
答案 1 :(得分:3)
如前所述,您无法在JavaScript continue
循环中使用break
或Array.prototype.forEach
。但是,还有其他选择:
使用jQuery .each()
函数(Reference)。
只需return true
继续,或return false
打破循环。
只需使用return
继续或throw new Error()
break 即可。我不一定建议这样做,但知道这是可能的,这很有趣。
try {
[1, 2, 3, 4].forEach(function(i) {
if (i === 2) {
return; // continue
}
if (i === 3) {
throw new Error(); // break
}
console.log(i);
});
}
catch (e) {
}
预期结果只是1