【问题标题】:Switch case jumps to wrong case in javascript (how to properly use the break command)javascript中switch case跳转到错误的case(如何正确使用break命令)
【发布时间】:2018-02-18 21:58:48
【问题描述】:

我的代码不是很长,所以我把它全部粘贴在这里。

代码不完整,但是当我运行它时,它首先跳转到它应该的 case “start”,然后跳转到 case “end”。我可以看到它,因为它会打印两个块的控制台日志文本。为什么要跳到“结束”案例?

<html>
    <body>
        <script>
            function stepStream(stream,step){
                switch (stream[step]){
                    case "start":
                        console.log("Started reading stream...");
                    case "end":
                        var success = "Finished reading dataStream.";
                        console.log(success);
                        return success;
                    default:
                        throw "Data stream format is bad";                  
                    case "gesture":
                        console.log("Running case gesture! But why?");
                        step+=1;
                        stepStream(stream,step);
                    case "say":
                        step+=1;
                        stepStream(stream,step);
                    case "sleep":
                        step+=1;
                        stepStream(stream,step);
                }

            }

            var sentence1 = "Where are my bananas? I thought you put them in my bag?";
            var sentence2 = "This is a rather irritating situattion.";  
            var dataStream = ["start","gesture","banzai","sleep",1.0,"say",sentence1,
                                "say",sentence2,"gesture","kubikasige","end"];
            stepStream(dataStream,0);//Second parameter sets where to start reading the dataStream.


        </script>
    </body>
</html>

【问题讨论】:

标签: javascript switch-statement


【解决方案1】:

问题是您在case 代码之后缺少break 关键字。如果没有中断,后续块将被执行,这就是为什么endstart 代码之后执行。您可以在 this W3Schools link 上阅读更多相关信息。

另外,来自JS reference

与每个 case 标签关联的可选 break 语句确保 一旦匹配的语句出现,程序就会跳出 switch 在 switch 之后的语句处执行并继续执行。如果 省略break,程序在下一个继续执行 switch 语句中的语句。

所以你的代码应该是这样的:

function stepStream(stream,step){
                switch (stream[step]){
                    case "start":
                        console.log("Started reading stream...");
                        break;
                    case "end":
                        var success = "Finished reading dataStream.";
                        console.log(success);
                        return success;
                    default:
                        throw "Data stream format is bad";                  
                    case "gesture":
                        //commUGesture(stream[i+1]);
                        //createLogLine("robot:CommU","event:gesture:"+stream[i+1]);
                        console.log("Running case gesture! But why?");
                        step+=1;
                        stepStream(stream,step);
                        break;
                    case "say":
                        step+=1;
                        stepStream(stream,step);
                        break;
                    case "sleep":
                        step+=1;
                        stepStream(stream,step);
                        break;
                }

您的“结束”案例最后有一个返回,因此代码不会落入其他案例。理想情况下,每个结尾都应该有一个break

【讨论】:

  • 啊,好吧,明白了,但是当我通过的唯一案例是“开始”时,为什么它会进入“结束”案例??
  • 因为你没有休息。之后是否匹配大小写并不重要。直到下一次中断(或返回、抛出)之前的所有代码都将被执行。我在答案中添加了更多信息。希望对您有所帮助!
  • 谢谢,switch 功能使用起来感觉有点冒险……
  • 并非如此,使用的次数越多,在每个案例之后放置 break 就成为一种习惯。就像放置分号或右大括号已成为一种习惯一样。我相信你会发现它很有用:)
【解决方案2】:

您忘记在开始块中添加中断语句,因此它一直到结束块。

【讨论】:

    【解决方案3】:

    问题很简单,所有switch case 必须以breakreturn 语句结尾,而您的情况则缺失。

    switch(var1)
    {
        case "start":
            console.log("Started");
            break;
        case "end":
             console.log("stopped");
             return "";
         .
         .
         .
    }
    

    【讨论】:

      【解决方案4】:

      代码将在第一个匹配的“case”处开始运行,但只有在到达“break”或“return”语句时才会停止运行;

      【讨论】:

        猜你喜欢
        • 2018-03-07
        • 2020-05-07
        • 2012-07-13
        • 1970-01-01
        • 2016-02-26
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多