从内部函数内部突破while循环'的身体

Breaking out of a while loop from within an inner function's body

本文关键字:循环 内部函数 内部 突破 while      更新时间:2023-10-26

如果我有:

while(foo) {
  var x = bar.filter(function(){ /* any problems with using `break;` here to exit the while-loop? */ });
  bar(), baz();
  // and so on...
}

会有什么奇怪或意想不到的行为吗?

break中断了它直接出现在其中的循环;如果函数(filter迭代器)中的循环(或开关)外有break,则是语法错误。

while添加一个条件,该条件由以下功能设置:

var stop = false;
while(foo && !stop) {
  var x = bar.filter(function(){
    if (someCondition) {
        stop = true;
    }
  });
  bar(), baz();
}

当然,也可以直接设置foo

while(foo) {
  var x = bar.filter(function(){
    if (someCondition) {
        foo = false;
    }
  });
  bar(), baz();
}

但我不知道foo是什么,这是否合理。

如果您需要barbaz在中断条件下不执行,则需要添加一个保护:

var stop = false;
while(foo && !stop) {
  var x = bar.filter(function(){
    if (someCondition) {
        stop = true;
    }
  });
  if (!stop) {
      bar(), baz();
  }
}

while(foo) {
  var x = bar.filter(function(){
    if (someCondition) {
        foo = false;
    }
  });
  if (foo) {
      bar(), baz();
  }
}

不能在while循环中的闭包函数中使用break,但是,例如,可以使用false作为显式返回值来向循环发出中断:

var count = 0,
    foo = true;
while(foo) {
  var bar = function() {
    if (++count < 23) { 
      console.log(count);
      return true; 
    } else { 
      return false; 
    }
  };
  if (bar() === false) { break; }
}

对于您的特定示例,因为filter不会返回闭包函数的返回值,所以您必须通过将您在while循环之外定义的值(例如foo)设置为false来中断循环:

var count = 0,
    baz = [1,2,3],
    foo = true;
while(foo) {
  var x = baz.filter(function(a) { 
    if (a > 2) {
      foo = false;
    }
    return a < 3  
  });
}

如前所述,不能在函数体内使用break

但是,根据你试图实现的具体内容,你也可以切换你的逻辑,直到中断时才重复,而是在需要时从函数内触发下一次迭代:

function filterFunc() {
    if (condition) {
        iter();
    }
}
function iter() {
    var x = bar.filter(filterFunc);
    bar(), baz();
}