ステートメント識別子
ラベル
ループ制御プログラムは高度プログラミングのために欠かせない機能です
複雑なアルゴリズムになれば、ループのネストも必要になります
ネストとは、すなわち for 文のなかに for 文を使用するような形です
このような複雑な状態では break や continue はどのように作用するのでしょうか?
実は、これらの文は現在の繰り返し処理分のなかで作用します
while(expression) {
while(expression) {
while(expression) {
break;
}
break;
}
break
}
このように、ループのなかで別のループがある場合
break や continue は現在繰り返しているループだけが対象です
while(true) {
while(true) if (confirm("第2ループです\n抜け出しますか?")) break;
if (confirm("第1ループです\n抜け出しますか?")) break;
}
第2ループ(つまり、ネストされた while)での confirm() メソッドで
[OK] を押すと break によってループから抜け出ますが、最初の while ループの中にまだいます
このプログラムから抜け出すには、第一ループで [OK] を押さなければなりません
しかし、これが非常に困ったことを引き起こす場合もまれにあるのです
例えば、何らかのエラーが発生し即座にループを抜け出したい場合
複雑にネストされている場合、全てのループを抜けるまでの作業は非常に面倒です
各繰り返し文の中で、エラーが発生したとこを調べる必要があります
そこで、ステートメントに識別子をつけ そのステートメントを対象にします
つまり、トップレベルのループステートメントに名前をつけそれを対象に
break や continue を使用することで、ネストに関係なく復帰や脱出を行えます
label : statements
label にはステートメント固有の識別子を指定します
statements は label に関連付けられたステートメントを1つ以上指定します
break や continue で label を指定すると、それを対象にジャンプします
var count = 0;
top: while(count < 10) {
alert("トップレベルのループです");
while(confirm("ループから抜け出しますか?")) break top;
count++
}
このプログラムを実行すると、まずトップレベルのループでダイアログを表示します
次に、ネストされたループで confirm() メソッドが使われ [OK] を押すと break が実行されます
もし、break だけの指定であればネストされたループを抜け出すだけでなので
[OK] を押しても [キャンセル] を押しても抜け出せません
この場合、トップレベルの while ループに top という名前をつけています
これを break top という形で指定しているため、トップレベルのループを対象に break します