the spec goes
BreakStatement : break ; break [no LineTerminator here] Identifier ;
then it goes
The program contains a break statement with the optional Identifier, where Identifier does not appear in the label set of an enclosing (but not crossing function boundaries) Statement.
...
A BreakStatement with an Identifier is evaluated as follows:
Return (break, empty, Identifier).
What on bloody earth does this mean?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With