どうやらlbl: break lbl;
は JavaScript で完全に有効です (しかし ではありませんlbl: continue lbl;
)。
このコンストラクトのあいまいな用途はありますか?
どうやらlbl: break lbl;
は JavaScript で完全に有効です (しかし ではありませんlbl: continue lbl;
)。
このコンストラクトのあいまいな用途はありますか?
ステートメントの前にラベルを付けることができます。質問へのコメントで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
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 である場合を除きます。