Во многих ситуациях парсеры JavaScript будут вставлять точки с запятой, если вы их опускаете. У меня вопрос, вы их не учитываете?
Если вы не знакомы с правилами, в Сайт Mozilla есть описание вставки точки с запятой. Вот ключевой момент:
If the first through the nth tokens of a JavaScript program form are grammatically valid but the first through the n+1st tokens are not and there is a line break between the nth tokens and the n+1st tokens, then the parser tries to parse the program again after inserting a virtual semicolon token between the nth and the n+1st tokens.
Это описание может быть неполным, потому что оно не объясняет пример @Dreas. У кого-нибудь есть ссылка на полные правила или видно, почему в примере ставится точка с запятой? (Я пробовал это в JScript.NET.)
Этот вопрос о переполнении стека связан, но говорит только о конкретном сценарии.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Да, вы должны использовать точку с запятой после каждого оператора в JavaScript.
Для единообразия и удобочитаемости ставьте точку с запятой после каждого оператора. +1
Аргументированное обсуждение лучше, чем принятие чьей-либо стороны.
См. Причины Крокфорда здесь: javascript.crockford.com/code.html «JavaScript позволяет использовать любое выражение в качестве оператора. Это может замаскировать некоторые ошибки, особенно при наличии вставки точки с запятой».
Зачем надеяться, что интерпретатор JS правильно угадает ваши намерения (не только сейчас, но с небольшими изменениями кода), когда вы можете просто добавить точку с запятой и однозначно передать их?
отличная статья о точках с запятой в js: mislav.uniqpath.com/2010/05/semicolons
Нет, используйте точки с запятой только тогда, когда они необходимы.
Это намного красивее. Так почему бы не? Конечно, это также подразумевает ВСЕГДА начинать ваше выражение с; когда он начинается с (. Итак, в этой строке: (function () {var iminvisible = 0}) () должен быть добавлен символ ";", иначе у вас будут проблемы.
Прочтите mislav.uniqpath.com/2010/05/semicolons :-) О, это уже было здесь в ответе.
Да, вы всегда должны использовать точку с запятой. Почему? Потому что, если вы в конечном итоге используете компрессор JavaScript, весь ваш код будет в одной строке, что приведет к поломке вашего кода.
Попробуйте http://www.jslint.com/; это обидит вас, но покажет вам много способов написать лучший JavaScript (и один из способов - всегда использовать точку с запятой).
Если ваш компрессор javascript может сломать ваш код javascript, я бы рекомендовал как можно скорее использовать другой.
Я бы сказал согласованность важнее, чем экономия нескольких байтов. Я всегда ставлю точки с запятой.
С другой стороны, я хотел бы указать, что есть много мест, где точка с запятой не требуется синтаксически, даже если компрессор уничтожает все доступные пробелы. например в конце блока.
if (a) { b() }
В этом конкретном случае вы сохраняете несколько байтов. а также используйте точку с запятой с if (a) b;
современные компрессоры будут вставлять точки с запятой mislav.uniqpath.com/2010/05/semicolons
Я думаю, это похоже на то, что обсуждалось в последнем подкасте. «Будьте либеральны в том, что вы принимаете», означает, что в синтаксический анализатор Javascript пришлось вложить дополнительную работу, чтобы исправить случаи, когда точки с запятой были опущены. Теперь у нас есть куча страниц, плавающих с плохим синтаксисом, которые могут сломаться в один прекрасный день в будущем, когда какой-нибудь браузер решит быть немного более строгим в отношении того, что он принимает. Этот тип правила также должен применяться к HTML и CSS. Вы можете написать неработающий HTML и CSS, но не удивляйтесь, если у вас возникнут странные и трудные для отладки поведения, когда какой-либо браузер не интерпретирует ваш неправильный код должным образом.
разница в том, что сломанный html по определению не соответствует спецификации. в спецификации javascript очень четко указано, что точки с запятой не являются обязательными. mislav.uniqpath.com/2010/05/semicolons
По-прежнему пропуск точки с запятой может привести к неоднозначным утверждениям, которые с точки зрения компилятора не являются двусмысленными, но для кого-то, кто пытается прочитать и проанализировать код в своей голове, очень трудно проанализировать, не запоминая множество конкретных правил. Это намного сложнее, чем новая строка = подразумевается точка с запятой. news.ycombinator.com/item?id=374529
JavaScript автоматически вставляет точки с запятой во время интерпретации вашего кода, поэтому, если вы поместите значение оператора return под строкой, оно не будет возвращено:
Ваш код:
return
5
Интерпретация JavaScript:
return;
5;
Таким образом, ничего не возвращается из-за автоматической вставки точки с запятой в JavaScript.
Это правда, но не имеет отношения к вопросу. Явное использование точки с запятой в этом случае не поможет.
Это сделало бы проблему очевидной с первого взгляда на код (что более очевидно, настоящий программист javascript сочтет ее очевидной и без точек с запятой)
Я использую точку с запятой, так как это моя привычка. Теперь я понимаю, почему я не могу разделить строку на две строки ... в конце каждой строки ставится точка с запятой.
Все, кажется, упускают из виду, что точки с запятой в JavaScript - это не оператор терминаторы, а оператор разделители. Это тонкая разница, но важна для способа программирования парсера. Относитесь к ним так, как они есть, и вы обнаружите, что оставить их будет намного естественнее.
Я программировал на других языках, где точка с запятой является оператором разделитель, а также необязательна, поскольку синтаксический анализатор выполняет «вставку точки с запятой» на новые строки, где это не нарушает грамматику. Так что я был знаком с ним, когда нашел его в JavaScript.
Мне не нравится шум в языке (это одна из причин, по которой я плохо разбираюсь в Perl), а точка с запятой - это шум в JavaScript. Поэтому я их опускаю.
Неоднозначный случай, который нарушается при отсутствии точки с запятой:
// define a function
var fn = function () {
//...
} // semicolon missing at this line
// then execute some code inside a closure
(function () {
//...
})();
Это будет интерпретироваться как:
var fn = function () {
//...
}(function () {
//...
})();
В итоге мы передаем вторую функцию в качестве аргумента первой функции, а затем пытаемся вызвать результат первого вызова функции как функцию. Вторая функция завершится ошибкой "... не функция" во время выполнения.
Вау, я всегда ставил точку с запятой в конце операторов, которые выглядят как var foo = "bar";, но я не знал, что они должны быть в конце функций, я думал, что закрывающая фигурная скобка заканчивает оператор? Так следует ли ставить точку с запятой после всех операторов блока, таких как if, while и т. д.?
@John: Нет. Обратите внимание, что в моем примере используется назначение функции. Вам не нужно и не следует ставить точки с запятой в обычные функции или блоки кода.
На самом деле это пример один, в котором новая строка не может заменить точку с запятой. Я имею привычку начинать любую строку с (ставить перед ней точку с запятой (так ;(function() {)
Спасибо, что поделились этим - этот точный вариант использования произошел при интеграции кода из двух разных источников. Мы выяснили, что это можно исправить с помощью точки с запятой довольно быстро, но не были уверены в основной причине.
Это тот самый лучшее объяснение автоматической вставки точки с запятой, который я где-то нашел. Это рассеет всю вашу неуверенность и сомнения.
В статье Точка с запятой в JavaScript не обязательна есть несколько действительно хороших замечаний об отказе от использования точек с запятой в Javascript. Он касается всех моментов, поднятых ответами на этот вопрос.
Мораль истории в приведенной выше ссылке такова: «когда строка начинается со скобок, добавьте к ней точку с запятой».
Если в языке есть определенные случаи, когда требуется точка с запятой, я бы применил ее ко всем случаям, если это возможно, просто ради кода, который легче читать, и кода, который просто хорошо выглядит. Итак ... +1.