从内部函数体内突破while循环

时间:2013-11-27 09:41:22

标签: javascript while-loop break

如果我有:

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

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

3 个答案:

答案 0 :(得分:5)

break打破它直接出现的循环;如果函数(你的break迭代器)中的循环(或开关)之外有filter,则表示语法错误。

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

答案 1 :(得分:2)

你不能在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为假:

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

答案 2 :(得分:0)

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

但是,根据你想要完成的内容,你也可以切换你的逻辑,不要重复,直到休息,但在需要时触发函数内的下一次迭代:

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

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