我的一个朋友正在教一堂使用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;
}
他告诉我,给代码贴标签并将块包装在代码周围是一种很好的做法,这样你就可以很容易地看到每个部分在做什么。他还说,有标签的中断和继续比没有标签的要容易阅读得多,因为你可以确切地知道你在中断什么。我从来没有见过这样的代码模式,所以我不确定这是否是真的。
我使用Javascript已经有一段时间了,这里有一些我以前从未见过的东西,还有一些我仍然不理解的东西。我认为break
关键字是专门用于打破循环的。higher
和lower
块不是循环,但显然你仍然可以突破它。这怎么可能?在我看来,打破一些不循环的东西似乎很奇怪。你也可以使用break
关键字来分解函数吗?
Breaks实际上可以有标签(并接受它们)。然而,我不确定"他"是谁,但我甚至可以说,"他"传达的是他的编程理想,而不是一个特定的标准。也就是说,没有必要使用标签,它只会让特定的人更容易阅读。(而且,IMHO,标签让人想起BASIC/GTO时代,通常会产生意大利面条代码)。
额外学分:问你的朋友他们是否曾经用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"
}
}
}
其中CCD_ 7退出块类似于CCD_ 8的动作方式。
顺便说一句,我发现这本书读起来有点容易:
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";
}
在javascript中对label
和break
进行了一点研究后,我就可以理解代码了。然而,我个人不喜欢这种编码风格,主要是因为标记的block
语法与字面对象表示法过于相似——我经常使用。甚至Mozilla的标签文档也告诉我们要避免它们:
标签在JavaScript中并不常用,因为它们使程序更难阅读和理解。尽可能避免使用标签,根据具体情况,更喜欢调用函数或抛出错误。
关于您的客观问题:
-
break
可用于退出for
循环、while
循环和case
语句,以及标记的blocks
。 -
不能使用
break
退出函数,必须使用return
。
来自MDN(粗体强调矿):
break
语句包含一个可选标签,该标签允许程序打破一个有标签的语句。break
语句需要嵌套在这个带标签的语句中带标签的语句可以任何阻止语句;它前面不必有循环声明
所以,是的,标签可以在循环之外使用,但是,不,不能使用它们从函数返回。
这些break
语句的使用方式与goto
在旧语言中的使用方式相同。正如Shark所指出的:您也可以在switch语句中使用它们,但不能在函数中使用。
这可能会让您感到困惑,因为他将标记块与无限的for(;;)
循环结合使用。
查看本文了解更多信息:http://james.padolsey.com/javascript/labelled-blocks-useful/