0

どうやらlbl: break lbl;は JavaScript で完全に有効です (しかし ではありませんlbl: continue lbl;)。

このコンストラクトのあいまいな用途はありますか?

4

1 に答える 1

1

ステートメントの前にラベルを付けることができます。質問へのコメントでboltclockcontinueによってすでに述べられているように、ループ(for、for-in、while、do-while)内でのみ許可されます。ループ、switch ステートメント、および任意のステートメント内で使用できます (既に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 ラベル付きステートメント

構文

LabelledStatement :

識別子 : ステートメント

セマンティクス

ステートメントには、ラベルを前に付けることができます。ラベル付きステートメントは、ラベル付き break および continue ステートメントと組み合わせてのみ使用されます。ECMAScript には goto ステートメントがありません。

ECMAScript プログラムは、ラベルと同じ識別子を持つ LabelledStatement で囲まれた LabelledStatement を含む場合、構文的に正しくないと見なされます。これは、ラベル付きステートメント内で直接的または間接的にネストされた FunctionDeclaration の本体内に表示されるラベルには適用されません。

プロダクション Identifier : Statement は、Statement のラベル セットに Identifier を追加し、Statement を評価することによって評価されます。LabelledStatement 自体に空でないラベル セットがある場合、これらのラベルは、評価する前に Statement のラベル セットにも追加されます。Statement を評価した結果が (break, V, L) で、L が Identifier に等しい場合、生成は (normal, V, empty) になります。

LabelledStatement の評価の前に、含まれている Statement は空のラベル セットを持っていると見なされます。ただし、それが IterationStatement または SwitchStatement である場合を除きます。

于 2012-09-23T13:32:52.050 に答える