你不知道的标记语句

94 阅读1分钟

前言

今天突然看到 js 居然还有标记语句,不明觉厉啊。

现在就让我们来看看什么是标记语句。

标记语句

标记语句可以和 break 或 continue 语句一起使用。标记就是在一条语句前面加个可以引用的标识符(identifier)。

语法:

label :
   statement

使用场景

跳出外部循环

使用continue:

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"

换成break试试:

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) {
         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

跳出代码块

'use strict'

foo: {
    console.log('face');
    break foo;
    console.log('this will not be executed');
}
console.log('swap');
  
// "face"
// "swap
  

跳出函数

L: 
function test() {
    console.log('face');
    break L;  // SyntaxError: Undefined label 'L'
    console.log('this will not be executed');
}
console.log('swap');

test()

非严格模式下,可以标记函数,但无法跳出,感觉没什么用,哪位大佬指点下。

Tip

严格模式下,函数不能被标识。

生成器函数也不能被标识。

总结

  • 标记语句一般用于跳出嵌套的for循环。
  • 标记语句也可用于跳出块级作用域。