JavaScript中的break关键字只用于跳出循环吗?

5

我的一个朋友正在教授使用Javascript进行编程的课程,他的其中一项作业是创建一个数字猜测游戏。以下是他的示例实现:

funProgram: for(;;) {
  numberGuesser: {
    var num = (Math.random() * 100) | 0;
    var guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", 0);
    var guesses = 1;
    guess: for(;;) {
      higher: {
        lower: {
          if(guess === num) break guess;
          if(guess > num) break lower;
          guess = +prompt("Too low. Try again.", 0);
          break higher;
        }
        guess = +prompt("Too high. Try again.", 0);
      }
      guesses++;
    }
    alert("You got it in " + guesses + " guesses! The number is " + num);
  }
  var again = prompt("Do you want to guess again (y/n)?", "y") === "y";
  if(!again) break funProgram;
}

他告诉我,在代码中标记和包装块是一种好的实践,这样您可以轻松地看到每个部分在做什么。他还说,与无标签的break和continue相比,有标签的更容易阅读,因为您可以确切知道您正在跳出哪个部分。我从未见过这样的代码模式,所以我不确定这是否正确。
我已经使用JavaScript一段时间了,在这里有一些我从未见过的东西,还有一些我仍然不理解。我认为break关键字专门用于退出循环。higher和lower块不是循环,但显然你仍然可以跳出它。这怎么可能?对我来说,跳出不循环的东西似乎很奇怪。您能否也使用break关键字中断函数?
4个回答

3

断点实际上可以有标签(并且接受它们)。然而,我不确定“He”是谁,但我可以说,“他”传达的是他的编程理念,而不是特定的标准。也就是说,没有必要使用标签,只是让那个人更容易理解。 (而且,在我看来,标签让人想起了BASIC / GOTO时代,通常导致意大利面代码)。

额外加分:问问你的朋友是否曾经用过BASIC;我敢打赌你会得到一个“是”的答案(在课程期间还会有很多坏习惯-这并不是针对个人,我只是从未有过与BASIC / VB程序员遵循[当前]编码模式的良好经验)

break命令通常用于退出循环,但是如果代码块嵌套在标签内,则会建立另一个可以从中断开的块。这也使您在何处退出断点方面具有更大的灵活性。例如:

for (;;){ // "for a"
  for(;;){ // "for b"
    break; // breaks "for b"
  }
}

在这种情况下,break只是用来退出嵌套的("for b")循环。然而:
myblock: {
  for(;;){
    for(;;){
      break mybock; // breaks label "myblock"
    }
  }
}

在这种情况下,break实际上会退出两个循环,因为您指示它完全退出标签块。这就像有:
function myblock(){
  for(;;){
    for(;;){
      return; // exits function "myblock"
    }
  }
}

return 语句类似于 break myblock,它可以退出代码块。


顺便说一句,我发现这个稍微容易阅读一些:

var again = true;
while (again){
    var num = (new Date()).getMilliseconds() % 100,
        guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", "1"),
        guesses = 1;
    while (num !== guess){
        guesses++;
        guess = +prompt((guess < num ? "Too low." : "Too high.") + " Try again.", guess);
    }
    alert("You got it in " + guesses + " guesses! The number is " + num);
    again = prompt("Do you want to guess again? (y/n)", "y") == "y";
}

+1. 我会站在与"He"相反的立场上。我认为给所有“标准”的break打上标签会使代码变得易读,因为由于缺乏标签的“日常使用”,标签会突出显示为“这与标准的break不同”,这意味着我需要花时间确保该break的功能与没有标签时完全相同。 - JimmiTh

1

通过对JavaScript中labelbreak进行一些研究,我能够理解代码。然而,我个人不喜欢那种编码风格,主要是因为标记的block语法与字面对象符号太相似了——我经常使用字面对象符号。甚至Mozilla关于标签的文档也告诉我们要避免使用它们:

在JavaScript中,标签并不常用,因为它们使程序更难以阅读和理解。尽可能避免使用标签,并根据情况优先考虑调用函数或抛出错误。

关于您的目标问题:

  1. break 可以用于退出 for 循环、while 循环和 case 语句,以及带标签的

  2. 你不能使用 break 来退出函数,必须使用 return


0

来自MDN(我加粗了):

break语句包括一个可选标签,允许程序跳出带有标签的语句。break语句需要嵌套在此标记语句中。标记语句可以是任何语句;它不必在循环语句之前。

因此,是的,标签可以在循环之外使用,但不能用于从函数返回。


0

这些break语句的使用方式与旧语言中使用goto的方式相同。正如Shark指出的那样:您也可以在switch语句中使用它们,但不能在函数中使用。

这可能让您感到困惑,因为他正在将标记块与无限的for(;;)循环结合使用。

请查看此处的文章以获取更多信息:http://james.padolsey.com/javascript/labelled-blocks-useful/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接