2012-02-08 34 views
5

我的一个朋友正在用Javascript教授一门编程课,他的任务之一是创建一个猜谜游戏。这是他的示例实现:Javascript中的break关键字仅仅意味着打破循环?

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; 
} 

他告诉我,这是标记代码和环绕它的块,所以你可以很容易地看到每个部分做一个很好的做法。他还表示标记休息和继续阅读比无标签阅读更容易,因为你可以确切地知道你正在脱离什么。我从来没有见过这样的代码模式,所以我不确定这是否属实。

我一直在使用Javascript一段时间,这里有一些我从未见过的东西,有些东西我仍然不明白。我认为break关键字专门用于突破循环。 higherlower块不是循环,但显然你仍然可以摆脱它。这怎么可能?打破不循环的东西似乎很奇怪。您是否也可以使用关键字break突破功能?

回答

3

休息can in fact have labels(并且接受他们)。然而,我不确定谁是“他”,但我会尽可能地说“他”正在传达他的编程理想,而不是一个特定的标准。也就是说,没有必要使用标签,它只是让特定的人更易读。 (而且,恕我直言,标签让人想起BASIC/GOTO日子,通常会导致Spaghetti Code)。

额外的信用:询问你的朋友是否曾经在BASIC中写过;我打赌你会得到一个“是”(在整个课程期间伴随着许多不良习惯 - 这不是简介,我从来没有在BASIC/VB程序员之后有过很好的经验]编码模式))

break命令通常用来退出循环,但是,如果代码块嵌套在标签内,你建立另一个块,你可以打破。这也给了你更多的灵活性,以决定退出的位置。例如:

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

在这种情况下,break只是为了退出嵌套(“为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"; 
} 
+0

+1。我会成为......“他”的对面栅栏上的一员。我会说标签所有的“标准”休息会使代码*不那么可读,因为缺乏标签的“日常使用”使得它突出显示为“这与标准的”break“不同”,这意味着我'我们会花时间确保这个“休息”的确的确如同没有标签一样工作。 – JimmiTh 2012-02-08 20:29:58

0

From MDN(粗体重点煤矿):

break语句包括一个可选的标签,允许在程序 打出来的标记声明。 break声明必须是嵌套在此标记语句中的 。 带标签的语句可以是 任何block语句;它不必在循环 声明之前。

所以,是的,标签可以在循环外使用,但是,不,你不能使用它们从函数返回。

0

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

这可能让你感到困惑,因为他正在使用带有标记的块以及无限的for(;;)循环。

看看这篇文章此处了解更多信息:http://james.padolsey.com/javascript/labelled-blocks-useful/

1

我可以在JavaScript labelbreak一个小小的研究之后,明白的代码。不过,我个人不喜欢这种编码风格,主要是因为标签block语法太类似于字面对象符号 - 我使用很多。甚至Mozilla的标签文档也告诉我们要避免它们:

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

关于你的客观题:

  1. break可以用来退出for循环,while循环和case报表,以及标记blocks

  2. 您不能使用break退出功能,您必须使用return