lbl:break lbl;在JavaScript中

时间:2012-09-23 13:11:27

标签: javascript

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

这种结构有什么不明确的用途吗?

1 个答案:

答案 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

ECMA262:5 12.12

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