The labeled statement can be used with break
or continue
statements. It is prefixing a statement with an identifier which you can refer to.
The labeled statement can be used with break
or continue
statements. It is prefixing a statement with an identifier which you can refer to.
label: statement
label
Any JavaScript identifier that is not a reserved word.
statement
A JavaScript statement. break
can be used with any labeled statement, and continue
can be used with looping labeled statements.
You can use a label to identify a loop, and then use the break
or continue
statements to indicate whether a program should interrupt the loop or continue its execution.
Note that JavaScript has no goto
statement, you can only use labels with break
or continue
.
In strict mode code, you can't use let
as a label name. It will throw a SyntaxError
(let is a reserved identifier).
let i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i === 1 && j === 1) { continue loop1; } console.log(`i = ${i}, j = ${j}`); } } // Output is: // "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" // Notice how it skips both "i = 1, j = 1" and "i = 1, j = 2"
Given an array of items and an array of tests, this example counts the number of items that passes all the tests.
let itemsPassed = 0; let 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++; }
let i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i === 1 && j === 1) { break loop1; } console.log(`i = ${i}, j = ${j}`); } } // Output is: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // Notice the difference with the previous continue example
Given an array of items and an array of tests, this example determines whether all items pass all tests.
let allPass = true; let 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; } } }
You can use labels within simple blocks, but only break
statements can make use of non-loop labels.
foo: { console.log('face'); break foo; console.log('this will not be executed'); } console.log('swap'); // this will log: // "face" // "swap"
Labels can only be applied to statements, not declarations. Still, the Annex B: Additional ECMAScript Features for Web Browsers section defines a legacy grammar to standardize labeled function declarations in non-strict code.
L: function F() {}
In strict mode code, however, this will throw a SyntaxError
:
'use strict'; L: function F() {} // SyntaxError: functions cannot be labelled
Generator functions can neither be labeled in strict code, nor in non-strict code:
L: function* F() {} // SyntaxError: generator functions cannot be labelled
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | Deno | Node.js | |
label |
1 |
12 |
1 |
4 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label