显然,lbl: break lbl;
在JavaScript中完全有效(但不是lbl: continue lbl;
)。
这种结构有什么不明确的用途吗?
答案 0 :(得分:1)
您可以在任何陈述前加上标签。 continue
仅允许在内容循环中(for,for-in,while,do-while),正如boltclock在问题的评论中已经说过的那样。 break
可以在循环,switch语句和任何语句中使用(已经由rob-w评论过)。
lbl: break lbl;
以上陈述有效。正如已经由frederic-hamidi所评论的那样“它本身已经突破”并且本身并不是非常有用,但请参阅下面的示例,了解它如何有用。
lbl: continue lbl;
上述陈述无效,因为它不是循环。
如何在块中使用中断 标签 的示例:
function test() {
var x='';
lb1: {
x+='1';
if(x.length >2) break lb1;
x+='2';
}
lb2: {
x+='3';
if(x.length >2) break lb2; //Can't break to lb1 because it isn't inside this block
x+='4';
}
console.log(x);
}
test();
输出:
123
这是一个如何在循环中使用中断 标签 的示例:
outer: for(var idxo=0; idxo < 5;++idxo) {
inner: for(var idxi=0; idxi < 5;++idxi) {
if (idxi==3) break outer;
console.log(idxo,idxi);
}
}
输出:
0 0,0 1,0 2
这是一个如何在循环中使用继续 标签 的示例:
outer: for(var idxo=0; idxo < 5;++idxo) {
inner: for(var idxi=0; idxi < 5;++idxi) {
if (idxi==3) continue outer;
console.log(idxo,idxi);
}
}
输出:
0 0,0 1,0 2,1 0,1 1 1,2 2 2,2 1,2 2,3 0,3 1,3 2,4 0,4 1 4
<12> 12.12标记语句<强>语法强>
LabelledStatement:
标识符:声明
<强>语义强>
声明可能以标签为前缀。带标签的语句仅与带标签的break和continue语句一起使用。 ECMAScript没有goto语句。
如果ECMAScript程序包含LabelledStatement,并且LabelledStatement包含与标签相同的标识符,则认为ECMAScript程序在语法上是不正确的。这不适用于在标记语句中直接或间接嵌套的FunctionDeclaration体内出现的标签。
生产标识符:通过将标识符添加到Statement的标签集然后评估Statement来评估Statement。如果LabelledStatement本身具有非空标签集,则在评估之前,这些标签也会添加到Statement的标签集中。如果评估Statement的结果是(break,V,L),其中L等于Identifier,则生成结果为(normal,V,empty)。
在评估LabelledStatement之前,包含的Statement被认为拥有一个空的标签集,除非它是IterationStatement或SwitchStatement,在这种情况下它被认为拥有一个由单个元素组成的标签集,为空