显然,lbl: break lbl;
在 JavaScript 中是完全有效的(但不是lbl: continue lbl;
)。
这个结构有什么不为人知的用途吗?
您可以在任何陈述之前添加标签。正如boltclock在问题的评论中continue
所说的那样,只允许在循环内(for,for-in,while,do-while) 。可以在循环、开关语句和任何语句中使用(正如rob-w已经评论过的)。break
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
这是一个如何在循环中使用continue 标签的示例:
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 0, 2 1, 2 2, 3 0, 3 1, 3 2, 4 0, 4 1, 4 2
12.12 标记语句
句法
标签声明:
标识符:声明
语义
声明可以以标签为前缀。带标签的语句仅与带标签的 break 和 continue 语句一起使用。ECMAScript 没有 goto 语句。
如果一个 ECMAScript 程序包含一个 LabelledStatement,该 LabelledStatement 由具有相同标识符的 LabelledStatement 包围,则认为它在语法上不正确。这不适用于出现在 FunctionDeclaration 主体中的标签,该标签直接或间接嵌套在带标签的语句中。
产生式 Identifier : Statement 通过将 Identifier 添加到 Statement 的标签集然后评估 Statement 来评估。如果 LabelledStatement 本身有一个非空标签集,这些标签也会在评估之前添加到 Statement 的标签集。如果 Statement 的计算结果是 (break, V, L),其中 L 等于 Identifier,则生成结果为 (normal, V, empty)。
在评估 LabelledStatement 之前,包含的 Statement 被认为拥有一个空标签集,除非它是 IterationStatement 或 SwitchStatement,在这种情况下,它被认为拥有一个由单个元素组成的标签集,空。