如果我有:
while(foo) {
var x = bar.filter(function(){ /* any problems with using `break;` here to exit the while-loop? */ });
bar(), baz();
// and so on...
}
会有任何奇怪或意外的行为吗?
答案 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
是什么以及这是否合理。
如果您需要bar
和baz
不要在违规情况下执行,您需要添加一名警卫:
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();
}