Почему многострочный комментарий вызывает автоматическую вставку точки с запятой?
Я был очень удивлен следующим поведением
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 затем вызывает автоматическую вставку точки с запятой, следуя обычным правилам.