--- title: label slug: Web/JavaScript/Reference/Statements/label tags: - JavaScript - Language feature - Statement translation_of: Web/JavaScript/Reference/Statements/label ---
ラベル付き文は、 {{jsxref("Statements/break", "break")}} 文や {{jsxref("Statements/continue", "continue")}} 文と組み合わせて使用することができます。これは文に参照先となる識別子の接頭辞をつけます。
注: ループやブロックに名前を付けることはめったにありません。ふつうは、ジャンプによるループの代わりに関数呼び出しを使用することができます。
ラベル : 文
ラベル文break は任意のラベル付き文で使うことができ、 continue はループのラベル付き文で使うことができます。ループを識別するためにラベルを使い、そして、プログラムがループを中断すべきか、またはその実行を継続すべきかを指し示すために、break または continue 文を使うことができます。
JavaScript には goto 文がなく、ラベルと break または continue のみ使用できます。
厳格モードのコードでは、 "let" をラベル名として使用することができません。この場合、 {{jsxref("SyntaxError")}} が発生します (let は予約語です)。
var i, j;
loop1:
for (i = 0; i < 3; i++) { // 1 番目の for 文に "loop1" というラベルをつける
loop2:
for (j = 0; j < 3; j++) { // 2 番目の for 文に "loop2" というラベルをつける
if (i === 1 && j === 1) {
continue loop1;
}
console.log('i = ' + i + ', j = ' + j);
}
}
// 結果:
// "i = 0, j = 0"
// "i = 0, j = 1"
// "i = 0, j = 2"
// "i = 1, j = 0"
// "i = 2, j = 0"
// "i = 2, j = 1"
// "i = 2, j = 2"
// "i = 1, j = 1" と "i = 1, j = 2" をスキップしていることに注目
配列 items と tests について、このサンプルはすべてを tests に渡した items の数を数えます。
var itemsPassed = 0;
var i, j;
top:
for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
continue top;
}
}
itemsPassed++;
}
var i, j;
loop1:
for (i = 0; i < 3; i++) { // 1 番目の for 文に "loop1" というラベルをつける
loop2:
for (j = 0; j < 3; j++) { // 2 番目の for 文に "loop2" というラベルをつける
if (i === 1 && j === 1) {
break loop1;
}
console.log('i = ' + i + ', j = ' + j);
}
}
// 結果:
// "i = 0, j = 0"
// "i = 0, j = 1"
// "i = 0, j = 2"
// "i = 1, j = 0"
// continue の例との違いに注目
配列 items と tests について、このサンプルは items のすべてを tests に渡したかを判断します。
var allPass = true;
var i, j;
top:
for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
allPass = false;
break top;
}
}
}
ラベルを単純なブロックの中でも使用することができますが、ループ以外のラベルでは break 文のみが意味を持ちます。
foo: {
console.log('face');
break foo;
console.log('this will not be executed');
}
console.log('swap');
// this will log:
// "face"
// "swap"
ECMAScript 2015 から、ラベル付き関数宣言が web compatibility annex of the specification において、厳格モード以外のコードで標準化されました。
L: function F() {}
ただし、厳格モードのコードでは {{jsxref("SyntaxError")}} が発生します。
'use strict';
L: function F() {}
// SyntaxError: functions cannot be labelled
ジェネレーター関数は、厳格モードであってもなくてもラベル付けすることはできません。
L: function* F() {}
// SyntaxError: generator functions cannot be labelled
| 仕様書 |
|---|
| {{SpecName('ESDraft', '#sec-labelled-statements', 'Labelled statement')}} |
{{Compat("javascript.statements.label")}}