Вы рекомендуете использовать точки с запятой после каждого оператора в JavaScript?

Во многих ситуациях парсеры JavaScript будут вставлять вам точки с запятой, если вы их пропустите. У меня вопрос, ты их оставляешь?

Если вы не знакомы с правилами, на сайте Mozilla есть описание вставки точек с запятой. Вот ключевой момент:

Если с первого по n-й токены формы программы JavaScript грамматически допустимы, но с первого по n+1-й токены не являются допустимыми, и между n-м токеном и n+1-м токенами есть разрыв строки, то анализатор пытается снова проанализировать программу после вставки виртуального токена с запятой между n-м и n+1-м токенами.

Это описание может быть неполным, потому что оно не объясняет пример @Dreas. У кого-нибудь есть ссылка на полные правила, или посмотрите, почему пример получает точку с запятой? (Я попробовал это в JScript.NET.)

Этот вопрос о переполнении стека связан, но говорит только о конкретном сценарии.

11 ответов

Решение

Да, вы должны использовать точки с запятой после каждого оператора в JavaScript.

Неоднозначный случай, который прерывается при отсутствии точки с запятой:

// define a function
var fn = function () {
    //...
} // semicolon missing at this line

// then execute some code inside a closure
(function () {
    //...
})();

Это будет интерпретироваться как:

var fn = function () {
    //...
}(function () {
    //...
})();

В итоге мы передаем вторую функцию в качестве аргумента первой функции, а затем пытаемся вызвать результат первого вызова функции как функцию. Вторая функция завершится с ошибкой "... не является функцией" во время выполнения.

Да, вы всегда должны использовать точки с запятой. Зачем? Потому что, если вы в конечном итоге используете JavaScript-компрессор, весь ваш код будет в одной строке, что приведет к поломке вашего кода.

Попробуйте http://www.jslint.com/; это повредит вашим чувствам, но покажет вам много способов лучше написать JavaScript (и один из способов - всегда использовать точки с запятой).

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

Я программировал на других языках, где точка с запятой является разделителем операторов, а также необязательна, так как синтаксический анализатор выполняет "вставку точек с запятой" на новых строках, где он не нарушает грамматику. Так что я не был незнаком с ним, когда нашел его в JavaScript.

Мне не нравится шум на языке (это одна из причин, по которой я плохо в Perl), а точки с запятой - это шум в JavaScript. Поэтому я их опускаю.

Я бы сказал, что последовательность важнее, чем сохранение нескольких байтов. Я всегда включаю точки с запятой.

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

if (a) { b() }

JavaScript автоматически вставляет точки с запятой при интерпретации кода, поэтому, если вы поместите значение оператора return ниже строки, оно не будет возвращено:

Ваш код:

return
5

Интерпретация JavaScript:

return;
5;

Таким образом, ничего не возвращается из-за автоматической вставки точек с запятой в JavaScript

Я думаю, что это похоже на то, что обсуждался в последнем подкасте. "Будьте либеральны в том, что вы принимаете" означает, что в анализатор Javascript необходимо было внести дополнительную работу, чтобы исправить случаи, когда точки с запятой были опущены. Теперь у нас есть множество страниц, плавающих вокруг с плохим синтаксисом, которые могут сломаться однажды в будущем, когда какой-то браузер решит быть немного более строгим в отношении того, что он принимает. Этот тип правил должен также применяться к HTML и CSS. Вы можете писать испорченный HTML и CSS, но не удивляйтесь, когда вам становится странно и сложно отлаживать поведение, когда какой-то браузер неправильно интерпретирует ваш неверный код.

Точка с запятой в JavaScript является необязательной, и в ней есть несколько хороших советов о том, как не использовать точки с запятой в Javascript. Здесь рассматриваются все вопросы, поднятые ответами на этот вопрос.

Это самое лучшее объяснение автоматической вставки точек с запятой, которое я нашел где угодно. Это уберет всю вашу неуверенность и сомнения.

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

Нет, используйте только точки с запятой, когда они необходимы.

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