Spec-Zone.ru › JavaScript

SyntaxError: функции не могут иметь метки

Исключение JavaScript "functions cannot be labelled" (функции не могут иметь метки) возникает, когда объявление function имеет метку перед ним.

Сообщение

SyntaxError: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement. (V8-based)
SyntaxError: In strict mode code, functions can only be declared at top level or inside a block. (V8-based)
SyntaxError: Generators can only be declared at the top level or inside a block. (V8-based)
SyntaxError: Async functions can only be declared at the top level or inside a block. (V8-based)

SyntaxError: functions can only be labelled inside blocks (Firefox)
SyntaxError: functions cannot be labelled (Firefox)
SyntaxError: generator functions cannot be labelled (Firefox)
SyntaxError: async function declarations can't appear in single-statement context (Firefox)

SyntaxError: Unexpected keyword 'function'. Function declarations are only allowed inside block statements or at the top level of a program. (Safari)
SyntaxError: Function declarations are only allowed inside blocks or switch statements in strict mode. (Safari)
SyntaxError: Unexpected token '*'. Cannot use generator function declaration in single-statement context. (Safari)
SyntaxError: Unexpected keyword 'function'. Cannot use async function declaration in single-statement context. (Safari)

Тип ошибки

SyntaxError

Что пошло не так?

Объявления функций никогда не должны иметь метки, поскольку метки должны применяться только к инструкциям, а не к объявлениям. Нет никакого способа фактически перейти к этой метке. Однако из-за некоторых устаревших правил синтаксиса JavaScript условие ошибки несколько сложнее, чем необходимо:

  • В строгом режиме объявления функций никогда не допускаются с метками.
  • В нестрогом режиме объявления функций допускаются с метками, но не тогда, когда функция является единственной инструкцией в инструкции if (которая сама по себе является устаревшей функцией).
  • Асинхронные функции, генераторные функции и асинхронные генераторные функции никогда не допускаются с метками.

Сообщение об ошибке может гласить что-то вроде "invalid place for a function declaration to appear" (недопустимое место для появления объявления функции), потому что, когда парсер видит метку, он ожидает, что за ней последует инструкция, а объявление функции не является инструкцией. Это зависит от того, рассматривает ли ошибка метку, за которой не может следовать функция, или функцию, которой не может предшествовать метка.

Примеры

Неправильно разобранный литерал объекта

Хотя возможно, что вы на самом деле ожидаете, что метка будет делать что-то похожее на целевой переход, обычно вы не намеревались, чтобы она была меткой. Наиболее распространенный случай — вы действительно хотите, чтобы это был ключ свойства в литерале объекта:

const createObj = () => {
  greet: function greet() { // SyntaxError: functions cannot be labelled
    console.log("Hello");
  }
};

Здесь {...} на самом деле не литерал объекта, а тело блока стрелочной функции, поэтому greet: становится меткой. Чтобы исправить это, вам нужно заключить литерал объекта в скобки:

const createObj = () => ({
  greet: function greet() {
    console.log("Hello");
  },
});

Вы также можете захотеть использовать синтаксис методов для литералов объектов, который позволяет избежать этой проблемы:

const createObj = () => ({
  greet() {
    console.log("Hello");
  },
});

См. также

  • Инструкция с меткой
  • function
  • Строгий режим
  • Устаревшие и вышедшие из употребления возможности

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Function_label

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API