SyntaxError: unlabeled break must be inside loop or switch

Ngoại lệ JavaScript "unlabeled break must be inside loop or switch" xảy ra khi câu lệnh break không nằm bên trong một vòng lặp hoặc câu lệnh switch.

Thông báo

SyntaxError: Illegal break statement (V8-based)
SyntaxError: unlabeled break must be inside loop or switch (Firefox)
SyntaxError: 'break' is only valid inside a switch or loop statement. (Safari)

Loại lỗi

SyntaxError.

Nguyên nhân?

Câu lệnh break có thể được dùng để thoát khỏi vòng lặp hoặc câu lệnh switch, và sử dụng chúng ở nơi khác là lỗi cú pháp. Ngoài ra, bạn có thể cung cấp một nhãn cho câu lệnh break để thoát ra khỏi bất kỳ câu lệnh nào có nhãn đó — tuy nhiên, nếu nhãn không tham chiếu đến câu lệnh đang chứa, một lỗi khác SyntaxError: label not found sẽ được ném ra.

Ví dụ

break không hợp lệ cú pháp

break không thể được dùng bên ngoài switch hoặc vòng lặp.

js
let score = 0;

function increment() {
  if (score === 100)
    break; // SyntaxError: unlabeled break must be inside loop or switch
  }
  score++;
}

Thay vì break, có thể bạn muốn dùng return để kết thúc sớm một hàm.

js
let score = 0;

function increment() {
  if (score === 100) {
    return;
  }
  score++;
}

Sử dụng break trong callbacks

break không thể được dùng trong callbacks, ngay cả khi callback được gọi từ một vòng lặp.

js
let containingIndex = 0;
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

while (containingIndex < matrix.length) {
  matrix[containingIndex].forEach((value) => {
    if (value === 5) {
      break; // SyntaxError: unlabeled break must be inside loop or switch
    }
  });
  containingIndex++;
}

Thay vào đó, hãy tái cấu trúc code để break được dùng bên ngoài callback.

js
let containingIndex = 0;
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

outer: while (containingIndex < matrix.length) {
  for (const value of matrix[containingIndex]) {
    if (value === 5) {
      break outer;
    }
  }
  containingIndex++;
}
js
let containingIndex = 0;
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

while (containingIndex < matrix.length) {
  if (matrix[containingIndex].includes(5)) {
    break;
  }
  containingIndex++;
}

Không có cách nào để kết thúc sớm vòng lặp forEach(). Bạn có thể dùng some() thay thế, hoặc chuyển đổi thành vòng lặp for...of.

js
array.forEach((value) => {
  if (value === 5) {
    break; // SyntaxError: unlabeled break must be inside loop or switch
  }
  // do something with value
});
js
array.some((value) => {
  if (value === 5) {
    return true;
  }
  // do something with value
  return false;
});
js
for (const value of array) {
  if (value === 5) {
    break;
  }
  // do something with value
}

Xem thêm