0

显然,lbl: break lbl;在 JavaScript 中是完全有效的(但不是lbl: continue lbl;)。

这个结构有什么不为人知的用途吗?

4

1 回答 1

1

您可以在任何陈述之前添加标签。正如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

ECMA262:5 12.12

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,在这种情况下,它被认为拥有一个由单个元素组成的标签集,空。

于 2012-09-23T13:32:52.050 回答