如何让另一个函数知道循环名称,以便它可以破坏它?

How to make another function aware of the loop name, so it can break it?

提问人:Mähnenwolf 提问时间:10/10/2022 更新时间:10/11/2022 访问量:72

问:

你看我有这个代码。(https://jsfiddle.net/kg4f2bu0/)。

在我的函数中,我为我的循环使用一个标签,因为如果它满足条件,我想打破它。在回调函数中检查条件。我想打破我的回调函数()中的循环。但它无法识别语句标签。如何让回调函数知道循环名称?iteratefor..ofcompare

这是 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)
JavaScript 循环 for-of-loop

评论

0赞 CherryDT 10/10/2022
顺便说一句,你正在重新发明轮子。看看和(甚至)。somefindincludes
0赞 Mähnenwolf 10/10/2022
@CherryDT 这只是我想要实现的一个非常简单的例子。我知道如何实现它,但我想知道我上面尝试的是否可能。
2赞 t.niese 10/10/2022
即使有可能,这也是一个非常糟糕的主意。这将导致代码难以阅读和维护。如果您或其他人稍后查看您的代码并看到该函数中未使用的标签,则很难判断它是否被使用以及在哪里使用。对于休息时间,尚不清楚它跳到哪里。

答:

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
它也会令人困惑且容易出错,因为它会在 和 之间创建隐式的、隐藏的依赖关系。iteratecompare
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
虽然是真的,但这不是我想要的,因为我的问题是关于标签名称的具体问题。