Почему я должен использовать точку с запятой после каждой функции в javascript?


282

Я видел, как разные разработчики включают точки с запятой после функций в javascript, а некоторые нет. Что является лучшей практикой?

function weLikeSemiColons(arg) {
   // bunch of code
};

или

function unnecessary(arg) {
  // bunch of code
}

Ответы:


424

Точка с запятой после объявления функции является не обязательно .

Грамматика a FunctionDeclarationописана в спецификации следующим образом:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Там нет точки с запятой грамматически, но может возникнуть вопрос, почему?

Точки с запятой служат для отделения утверждений друг от друга, и a FunctionDeclarationне является утверждением .

FunctionDeclarationsоцениваются до того, как код входит в исполнение, подъем - это общее слово, используемое для объяснения этого поведения.

Термины «объявление функции» и «оператор функции» часто ошибочно используются взаимозаменяемо, поскольку в спецификации ECMAScript не описан оператор функции, однако есть некоторые реализации, которые включают оператор функции в свою грамматику, в частности Mozilla, но опять же это это нестандартно.

Однако точки с запятой всегда рекомендуются, когда вы используете FunctionExpressions, например:

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

(function () {
  //...
})();

Если вы опустите точку с запятой после первой функции в приведенном выше примере, вы получите совершенно нежелательные результаты:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

Первая функция будет выполнена немедленно, потому что круглые скобки, окружающие вторую, будут интерпретированы как Argumentsвызов функции.

Рекомендуемые лекции:


2
Отредактировано, чтобы уточнить, что статья рассказывает о функциональных выражениях
CMS

1
Не совсем знаком с ECMA, но я тоже использую этот стандарт. Хороший пост. Большинство статей, которые я вижу в Интернете, и примеры кода, которые я использую для этого, используют этот стандарт, поэтому я просто адаптировался к нему.
регулярное выражение

1
На некоторую путаницу здесь может повлиять отсутствие хорошего английского слова «разрешено, потому что оно будет игнорироваться». Мы отступаем от слов «необязательный», но это вводит в заблуждение, поскольку предполагает, что отсутствие точки с запятой после объявления относится к той же категории, что и отсутствие точки с запятой после утверждения. Последнее является необязательным в совершенно ином смысле: это происходит потому, что парсер добавит пропущенную точку с запятой, которую вы пропустили , в то время как в этом случае он будет игнорировать включенную вами точку с запятой . Иными словами, если один не является обязательным, то восемь .
точка с запятой

Ссылка «Демистифицированные выражения именованных функций» теперь ссылается на мертвый URL, веб-архив находится здесь: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
Tony

Последний пример отличный. Пропуск точки с запятой в этом случае приводит к чрезвычайно странным и трудно отлаживаемым ошибкам. От всей души с повышенным голосованием.
Ян Янковский,

38

Я использую их после объявления функции как переменной:

var f = function() { ... };

но не после определений в классическом стиле:

function f() {
    ...
}

NetBeans, как и другим IDE, нравится видеть точку с запятой после функции как переменная, например this.animaton_fun = function () {...};
Ланс Кливленд

6
Но - для спрашивающего - почему ?
Люк

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

20

JS Lint является соглашением де-факто, и в нем не указывается точка с запятой после тела функции. Смотрите раздел «Точка с запятой» .


10
Я воочию увидел, что функция не работает из-за отсутствия точки с запятой. Я совершенно не согласен с тем, что отказ от этого является условием. Хотя в 99,99% случаев он не ломается, в некоторых ситуациях я заметил, что IE не может перехватить JavaScript без точки с запятой.
MillsJROSS

8
Мой ответ касается только определений функций, таких как два примера вопроса. В этих случаях завершающая точка с запятой не требуется ни в одном браузере, ни в одной ситуации. Я думаю, вы могли бы думать о функциональных выражениях. Это совершенно другой вопрос, и не тот, который был рассмотрен в первоначальном вопросе.
Дэвид Хедлунд

var myFunction = function (arg) {console.log (arg); } (function () {console.log («совершенно не связанная функция»); возвращает «посмотрим, что произойдет»;} ());
Мацей Кравчик,

@MillsJROSS Я второй ответ Дэвида, и был бы рад, если бы вы описали неудачу, с которой вы столкнулись. Действительно ли это было функциональное выражение или ошибка IE?
wlnirvana

7

Просто оставайся последовательным! Они не нужны, но я лично использую их, потому что большинство методов минификации основаны на точках с запятой (например, Packer ).


5

На самом деле просто зависит от ваших предпочтений. Мне нравится заканчивать строки кода точкой с запятой, потому что я привык к Java, C ++, C # и т. Д., Поэтому я использую те же стандарты для кодирования в javascript.

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

Браузеры будут работать в любом случае, но, возможно, когда-нибудь они придумают более строгие стандарты, регулирующие это.

Пример кода я бы написал:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
строки обязательно должны заканчиваться точкой с запятой, хотя. в противном случае минификатор может полностью нарушить функциональность
Дэвид Хедлунд

9
@ Давид: в этом случае минификатор сломан, не так ли?
DisgruntledGoat

Согласовано. Это естественный способ кодирования для людей (таких как я), происходящих из C / C ++. Это также делает код более читабельным.
Аншуман Манрал

3

На самом деле это больше, чем просто вопрос соглашения или последовательности.

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

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


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

1
Согласитесь, и если не ставить точки с запятой после функций, я упомяну эту проблему минимизации. Удачи, сэр.
Мейсон

Upvote, потому что усиление проблемы минимизации прояснило мое понимание
JackW327

1

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

нужна точка с запятой

var x = function(){};
var x = new function(){};
this.x = function(){};

не нужно ставить точку с запятой

function x(){}

0

ПРОСТО:

Рекомендуется оставлять точки с запятой ;после фигурных скобок. Они считались лучшей практикой в ​​течение многих лет.

Одно из преимуществ их использования - если вы хотите минимизировать свой JavaScript.

Как минимизирование Javascript, помогает немного уменьшить размер файла.

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

Если вы НЕ используете точки с запятой и хотите минимизировать (как это делают многие разработчики, если их сайт обслуживает много JavaScript), вы можете получить всевозможные ошибки / предупреждения.


0

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

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

и

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

когда вы минимизируете оба, вы получите следующее в качестве вывода

Обратите внимание, что комментарии только для иллюстрации

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

и

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.