Почему многострочный комментарий вызывает автоматическую вставку точки с запятой?

Я был очень удивлен следующим поведением

      f1 = (x) => {
    return /* Comment on x. */ x
}

f2 = (x) => {
    return /*
             Comment on x.
           */ x
}

console.log(f1(1)) // => 1
console.log(f2(2)) // => undefined

Это очевидно, потому что f2 анализируется с автоматической вставкой точки с запятой как

      f2 = (x) => {
    return;
    x;
};

и действительно, Firefox сигнализирует о мертвом коде после возврата.

Это действительно то, что имелось в виду под автоматической вставкой точки с запятой? Это проблема реализации или проблема языка?

РЕДАКТИРОВАТЬ: кто-то, кажется, считает, что мой вопрос такой же, как Почему возвращаемое значение должно быть в той же строке, что и оператор возврата в JavaScript?. Ну, извините, это не так. Я разместил комментарий, который занимает несколько строк. А в обычных методах синтаксического анализа комментарии ведут себя так, как будто их не существует , поэтомуf2должно быть эквивалентно

      f2 = (x) => {
  return x
}

Мой вопрос заключается в том, является ли это дефектом реализации или такая обработка комментариев соответствует стандарту. Почему многострочный комментарий рассматривается как разрыв строки, а не игнорируется?

1 ответ

Это ожидаемо, это работает так, как задумано. Спецификация ES6 говорит следующее о грамматике для комментариев :

Комментарии ведут себя как пробелы и отбрасываются, за исключением того, что если MultiLineComment содержит кодовую точку конца строки, то весь комментарий рассматривается как LineTerminator для анализа синтаксической грамматикой.

И этот LineTerminator затем вызывает автоматическую вставку точки с запятой, следуя обычным правилам.

Другие вопросы по тегам