Javascript 从内部函数中中断while循环';身体

Javascript 从内部函数中中断while循环';身体,javascript,while-loop,break,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... } 是否会有任何奇怪或意外的行为?您不能在while循环内的闭包函数中使用break,但是,您可以使用false作为显式返回值,向循环发出中断: var count = 0,

如果我有:

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

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

您不能在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; }
}

中断
中断它直接出现在其中的循环;如果函数(您的
过滤器
迭代器)中的
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,也不知道这是否合理

如果需要在断开状态下不执行
bar
baz
,则需要添加防护:

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


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

但根据您要完成的具体内容,您也可以切换逻辑,直到中断时才重复,但在需要时从函数内部触发下一次迭代:

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

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

解释原始任务
break时,它将不起作用,因此yes是一个问题plenty@zerkms有什么不清楚?@musefan您知道的任何解决方法?您不能从嵌入式功能中找到。-1:为什么您自己决定OP不再需要
过滤器
功能?哦,我明白了。我更喜欢使用防护装置,使其更简单。
while(foo) {
  var x = bar.filter(function(){
    if (someCondition) {
        foo = false;
    }
  });
  if (foo) {
      bar(), baz();
  }
}
function filterFunc() {
    if (condition) {
        iter();
    }
}

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