提问人:Mähnenwolf 提问时间:10/10/2022 更新时间:10/11/2022 访问量:72
如何让另一个函数知道循环名称,以便它可以破坏它?
How to make another function aware of the loop name, so it can break it?
问:
你看我有这个代码。(https://jsfiddle.net/kg4f2bu0/)。
在我的函数中,我为我的循环使用一个标签,因为如果它满足条件,我想打破它。在回调函数中检查条件。我想打破我的回调函数()中的循环。但它无法识别语句标签。如何让回调函数知道循环名称?iterate
for..of
compare
这是 JavaScript 代码。您可以在此处阅读有关标签名称的信息:https://javascript.info/while-for#labels-for-break-continue
const myArr = [1, 2, 3, 4, 5, 6];
const iterate = (arr, callback) => {
search: for (const item of arr) {
callback(item)
}
}
const compare = (num) => {
console.log(num);
if (num === 4) {
console.log("breaking");
break search;
}
}
iterate(myArr, compare)
答:
3赞
Thomas
10/10/2022
#1
您不能从另一个函数内部中断循环。这样做的原因是技术性的:在代码开始运行之前,对 的标签进行一次解析。所以在运行时,它只是一个简单的“goto”;JavaScript 引擎不会在调用堆栈中寻找包含匹配标签的函数。(如果没有怎么办?如果有多个怎么办?break
相反,您可以做的是返回一个布尔值,该值指示是否找到了该项目,从而指示循环是否应该中断:
const myArr = [1, 2, 3, 4, 5, 6];
const iterate = (arr, callback) => {
for (const item of arr) {
if (callback(item)) {
break;
}
}
}
const compare = (num) => {
console.log(num);
if (num === 4) {
console.log("breaking");
return true;
}
return false;
}
iterate(myArr, compare)
评论
0赞
Mähnenwolf
10/10/2022
这确实是有道理的。你的例子本来是我这样做的另一种选择,但我有点希望我的方式能以某种方式成为可能,至少它会很方便。
1赞
Thomas
10/10/2022
它也会令人困惑且容易出错,因为它会在 和 之间创建隐式的、隐藏的依赖关系。iterate
compare
0赞
Mähnenwolf
10/10/2022
是的,这将是我的第二个或后续问题,关于如何使标签名称动态化。我只是希望太多了。
0赞
factorypolaris
10/10/2022
#2
使用 Array.every() 执行循环。一旦返回 False,循环就结束了。下面是一个示例。
const myArr = [1, 2, 3, 4, 5, 6];
const iterate = (arr, callback) => {
search: arr.every(compare)
}
const compare = (num) => {
console.log(num);
if (num === 4) {
console.log("breaking");
return false;
}
return true;
}
iterate(myArr, compare)
评论
0赞
Mähnenwolf
10/10/2022
虽然是真的,但这不是我想要的,因为我的问题是关于标签名称的具体问题。
评论
some
find
includes