--- 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")}}