the spec goes
BreakStatement : break ; break [no LineTerminator here] Identifier ;
then it goes
A label is something like this:
// ...
mylabel:
// ...
This can be placed anywhere as a statement.
It is useful to break
/continue
when having multiple nested for
loops.
An example of its usage:
var 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"
Source.
If you look on MDN, there's examples
outer_block: {
inner_block: {
console.log('1');
break outer_block; // breaks out of both inner_block and outer_block
console.log(':-('); // skipped
}
console.log('2'); // skipped
}
as you can see, you can break
with an identifier that selects a label higher up in the chain than just the first immediate parent statement.
The default action without an identifier would be
outer_block: {
inner_block: {
console.log('1');
break; // breaks out of the inner_block only
console.log(':-('); // skipped
}
console.log('2'); // still executed, does not break
}
The break has to be inside the label, you can't break labels based on indentifiers that the break is outside of.