Чому я повинен використовувати крапку з комою після кожної функції в JavaScript?


282

Я бачив, як різні розробники включають крапки з комою після функцій у JavaScript, а деякі - ні. Яка найкраща практика?

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

або

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

Відповіді:


424

Точка з комою після оголошення функції є не обов'язково .

Граматика а FunctionDeclarationописується в специфікації так:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Граматично не потрібна крапка з комою, але може задатися питанням, чому?

Точки з комою служать для відокремлення тверджень один від одного, а а FunctionDeclaration- не твердження .

FunctionDeclarations оцінюються до вступу коду у виконання, підйом - це загальне слово, яке використовується для пояснення такої поведінки.

Терміни "функція декларації" та "оператор" часто помилково використовуються взаємозамінно, тому що не існує оператора функції, описаного в специфікації ECMAScript, однак є деякі реалізації, які включають в свою граматику оператор функції, зокрема Mozilla-, але знову ж таки це є нестандартним.

Однак крапки з комою завжди рекомендуються там, де ви використовуєте FunctionExpressions, наприклад:

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

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

Якщо пропустити крапку з комою після першої функції у наведеному вище прикладі, ви отримаєте абсолютно небажані результати:

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

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

Перша функція буде виконана негайно, оскільки дужки, що оточують другу, будуть інтерпретуватися як Argumentsвиклик функції.

Рекомендовані лекції:


2
Відредагована для уточнення, ця стаття розповідає про вираження функцій
CMS

1
Не повністю знайомий з ECMA, але це стандарт, який я також використовую. Гарний пост. Більшість тутів, які я бачу в Інтернеті, та зразки коду, які я DL, використовують цей стандарт, тому я просто адаптувався до нього.
regex

1
На деяку плутанину тут може вплинути відсутність хорошого англійського слова "дозволено, тому що воно буде проігноровано". Ми відмовляємося говорити "необов’язково", але це вводить в оману, оскільки це говорить про те, що не включаючи крапку з комою після декларації потрапляє до тієї ж категорії, що не включає крапку з комою після заяви. Останнє є необов’язковим у зовсім іншому значенні: це відбувається тому, що аналізатор додасть пропущену крапку з комою, яку ви пропустили , в цьому випадку це тому, що аналізатор буде ігнорувати крапку з комою, яку ви включили . Інакше кажучи: якщо один необов’язковий, то вісім .
напівколонка

Посилання "Демістифіковані вирази функцій іменовані" посилається на мертву URL-адресу. Веб-архів має копію тут: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
Тоні,

Останній приклад - чудовий. Упущення крапки з комою в цьому випадку призводить до надзвичайно дивних і важких для відладки помилок. Повноцінне голосування.
Ян Янковський

38

Я використовую їх після оголошення функції змінної:

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

але не після визначень класичного стилю:

function f() {
    ...
}

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

6
Але - для запитувача - чому ?
Лука

це допомагає під час кроку збирання. Коли скрипт-утилізатор бачить крапку з комою, йому не потрібно додавати розрив рядка до вихідного файлу, якщо цього немає, буде створено розрив рядка і файл буде трохи більшим.
автобоксер

20

JS Lint - це фактична умова, і вона не говорить про крапку з комою після функції функції. Дивіться розділ «Точка з комою» .


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

8
Моя відповідь стосується лише визначень функцій, таких як два приклади запитання. У цих випадках закінчується крапка з комою не потрібна ні в якому веб-переглядачі, в будь-якій ситуації. Я думаю, ви можете думати про вираження функцій. Вони зовсім інша справа, а не одна, про яку було сказано в оригінальному питанні.
Девід Гедлунд

var myFunction = функція (arg) {console.log (arg); } (функція () {console.log ('повністю незв'язана функція'); повернути 'побачити, що відбувається';} ());
Maciej Krawczyk

@MillsJROSS Я другий відповідь Давида, і буде радий, якщо ви докладно розкриєте невдачу, на яку ви зіткнулися. Це справді було вираження функції або помилка IE?
wlnirvana

7

Просто залишайтеся послідовними! Вони не потрібні, але я особисто їх використовую, тому що більшість методів мінімізації покладаються на напівколонку (наприклад, Пакер ).


5

Дійсно просто залежить від ваших уподобань. Мені подобається закінчувати рядки коду напівколонами, тому що я звик до Java, C ++, C # тощо, тому я використовую ті самі стандарти для кодування в JavaScript.

Я, як правило, не закінчую декларації функцій у напівколонках, але це лише моя перевага.

Веб-браузери запускають його в будь-якому випадку, але, можливо, одного дня вони придумають більш жорсткі стандарти, що керують цим.

Я б написав приклад коду:

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

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

9
@david: у такому випадку мініфіксатор зламаний, напевно?
НезадоволенеЗакриття

Домовились. Це природний спосіб кодування для людей (як я), що походять із 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.