Javascript中开关盒内部的循环中断

Javascript中开关盒内部的循环中断,javascript,for-loop,switch-statement,continue,Javascript,For Loop,Switch Statement,Continue,我必须使用什么命令才能跳出for循环,也可以从//code-inside直接跳到//code-after //code before for(var a in b) { switch(something) { case something: { //code inside break; } } } //code after 需要

我必须使用什么命令才能跳出for循环,也可以从
//code-inside
直接跳到
//code-after

//code before
for(var a in b)
    {
    switch(something)
        {
        case something:
            {
            //code inside
            break;
            }
        }
    }
//code after

需要退出时,请使用另一个变量进行标记:

var b={firstName:'Peter',lastName:'Smith'};
var keepGoing=true;
用于(b中的变量a){
开关(真){
案例1:
keepGoing=false;
打破
}
如果(!keepGoing)中断;
console.log('switch end');
}

console.log('for end')这取决于你想完成什么。。。我通常做的一件事是这样的:

    //code before
for(var a in b)
{
    var breakFor = false;
    switch(something)
    {
        case something:
        {
            //code inside
            breakFor = true;
            break;
        }
    }
    if (breakFor)
        break;
}
//code after
你可以用。有一个带标签的语句,然后切换到该标签
outerLoop
是我在这里使用的标签

//code before
outerLoop:
for (var a in b) {
    switch (something) {
        case 'case1':
            //code inside
            break outerLoop;
    }
}
//code after

不幸的是,Javascript没有允许
break
ing通过多个级别。最简单的方法是通过创建匿名函数来利用
return
语句的功能:

//code before
(function () {
    for (var a in b) {
        switch (something) {
        case something:
            {
                //code inside
                return;
            }
        }
    }
}());
//code after
这是因为
return
离开了函数,因此隐式地离开了循环,直接转到
code-after

//code before
for(var a in b)
    {
    switch(something)
        {
        case something:
            {
            //code inside
            break;
            }
        }
    }
//code after

正如评论中所指出的,我的上述回答是不正确的,可能会出现多级
中断
ing的情况,如中所述,我已投了赞成票


从七年后的角度来看,这是否明智有些疑问。

我总是发现使用条件语句是控制代码流的最简单方法之一,至少在概念上是如此

var done = false;
//code before for loop
for(var a in b){
    switch(switchParameter){
        case firstCase:
            //code inside
            done = true;
            break;
        }
    }
    if(done)
        break;
}
//code outside of for loop

您可以知道要断开哪个环路/开关

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}
函数foo()
{
舞蹈:
对于(var k=0;k<4;k++){
对于(var m=0;m<4;m++){
如果(m==2){
霹雳舞;
}
}
}
}

< P> > < /P> <代码>(var i=0;IADAD<代码> Stury;< /代码>切换结束后的代码< >代码>。您可以考虑重构您的解决方案。@ JAAK KUTT永远不会触碰我的缩进风格。@ BasiLo并没有引起注意“I”-S和“SUE”-S:)。您是否愿意至少在最内部的评论和打断处添加额外的缩进?@Jaak Küttгзззззжжззззззззззз1079?完全可以接受(虽然
break
允许使用
label
参数,但我个人认为labels与BASIC一起使用,只会导致…)使用
label
一次是可以的,但如果您更频繁地使用它,最终可能会得到一个意大利面代码。在这种情况下,我首先建议重构解决方案。耶!意大利面我觉得匿名函数对于这类事情来说太过分了。此外,根据for/switch的详细程度,我可能会浏览一下代码,看到一个
返回
,而不会将它与匿名函数关联起来(使以后的维护更加混乱)。当然,这不是一段复杂的代码,但在实践中应用它可能会很快变得很糟糕。@BradChristie我不确定匿名函数是否有什么大不了的,甚至有点过头了!至于可读性,这就是评论的目的,当然。。。重构可能是最理想的,但这是离开循环的最干净的方式。虽然不是戏剧性的,但我相信。@Bradcristie个人认为,当我们讨论13000000次操作/秒的规模时,我并不太担心@非常感谢:你当然是对的。我的答案经过编辑,指向了本页其他地方的正确答案。Jeff是第一个使用bool var来完成此任务的人,其他用户使用相同的语句获得更多的投票。为什么?最好对此代码进行一些解释,特别是因为还有六个其他答案。这并不能解决问题,因为当
i=b.length
时,代码将再运行一次。此外,如果
i
设置为小于
b.length
,这将非常危险,它将永远运行!!!。所以我建议我们应该使用函数、标签或标志来代替它。@TrungLeNguyenNhat:for循环条件查找
b
,而不是