在内部函数体中跳出while循环

5
如果我有:

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

会出现任何奇怪或意外的行为吗?


解释原始任务。 - zerkms
2
当从函数内部调用break;时,它将不起作用,因此会遇到很多问题。 - musefan
1
@zerkms,有什么不清楚的吗? - user3025492
@musefan,你知道有什么解决办法吗? - user3025492
你无法从嵌套函数内部进行操作。 - Sully
这就是为什么@zerkms要求您解释原始任务的原因。你想做什么?在什么条件下会打破循环? - musefan
3个回答

6

break语句会跳出它所在的循环,如果你在函数(例如你的filter迭代器)中使用break语句并且没有在循环(或switch)内部,那么就会导致语法错误。

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();
  }
}

3

在 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  
  });
}

1
为什么你自作主张地决定OP不再需要filter函数? - musefan
哦,我明白了。我更喜欢使用守卫 - 这样可以保持简单。 - Rolf

0

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

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

function filterFunc() {
    if (condition) {
        iter();
    }
}

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

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