Dlaczego powinienem używać średnika po każdej funkcji w javascript?


282

Widziałem, że różni programiści włączają średniki po funkcjach w javascript, a niektórzy nie. Jaka jest najlepsza praktyka?

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

lub

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

Odpowiedzi:


424

Średniki po deklaracjach funkcji niekonieczne .

Gramatyka a FunctionDeclarationjest opisana w specyfikacji w następujący sposób:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Gramatyka nie wymaga średnika, ale może zastanawiać się, dlaczego?

Średniki służą do oddzielania od siebie instrukcji , a a FunctionDeclarationnie jest instrukcją .

FunctionDeclarationssą oceniane przed uruchomieniem kodu, podnoszenie jest powszechnym słowem używanym do wyjaśnienia tego zachowania.

Terminy „deklaracja funkcji” i „instrukcja funkcji” są często błędnie używane zamiennie, ponieważ nie ma instrukcji funkcji opisanej w specyfikacji ECMAScript, jednak istnieją pewne implementacje, które zawierają instrukcję funkcji w swojej gramatyce, w szczególności Mozillę, ale znowu to jest niestandardowy.

Jednak średnice są zawsze zalecane w przypadku używania FunctionExpressions, na przykład:

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

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

Jeśli pominiesz średnik po pierwszej funkcji w powyższym przykładzie, otrzymasz całkowicie niepożądane wyniki:

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

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

Pierwsza funkcja zostanie wykonana natychmiast, ponieważ nawiasy otaczające drugą będą interpretowane jako Argumentswywołanie funkcji.

Polecane wykłady:


2
Artykuł został zredagowany w celu wyjaśnienia, że ​​mówi o wyrażeniach funkcji
CMS

1
Nie do końca zaznajomiony z ECMA, ale to też standard, którego używam. Dobry post Większość tut, które widzę online i próbki kodu używam tego standardu, więc właśnie się do niego dostosowałem.
regex

1
Na niektóre zamieszanie w tym przypadku może mieć wpływ brak dobrego angielskiego słowa „dozwolone, ponieważ zostanie zignorowane”. Wracamy do powiedzenia „opcjonalne”, ale jest to mylące, ponieważ sugeruje, że nieuwzględnianie średnika po deklaracji należy do tej samej kategorii, co nie uwzględnianie średnika po instrukcji. To ostatnie jest opcjonalne w zupełnie innym znaczeniu: dzieje się tak, ponieważ analizator doda brakujący średnik, który pominąłeś , podczas gdy w tym przypadku analizator zignoruje dołączony średnik . Innymi słowy: jeśli jeden jest opcjonalny, to także osiem .
Semicolon

Link „Wyjaśnione funkcje wyrażeń nazwanych” prowadzi do martwego adresu
Tony

Ostatni przykład jest świetny. Pominięcie średnika w tym przypadku prowadzi do bardzo dziwnych i trudnych do debugowania błędów. Głosowanie z całego serca.
Yan Yankowski

38

Używam ich po deklaracjach funkcji jako zmiennej:

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

ale nie po definicjach w stylu klasycznym:

function f() {
    ...
}

NetBeans, podobnie jak inne środowiska IDE, lubią widzieć średnik po zmiennej funkcji takiej jak this.animaton_fun = function () {...};
Lance Cleveland

6
Ale - dla pytającego - dlaczego ?
Łukasz

pomaga na etapie kompilacji. Gdy skrypt Uglifier widzi średnik, nie musi dodawać podziału wiersza do pliku wyjściowego, jeśli nie, zostanie wygenerowany podział wiersza, a plik będzie nieco większy.
autoboxer

20

JS Lint jest de facto konwencją i nie podaje średnika po treści funkcji. Zobacz sekcję „Średnik” .


10
Byłem świadkiem z pierwszej ręki funkcji, która zawiodła z powodu braku średnika. Całkowicie nie zgadzam się z tym, że pominięcie tego jest konwencją. Podczas gdy 99,99% czasu się nie psuje, są pewne sytuacje, w których zauważyłem, że IE nie był w stanie zinterpretować JavaScript bez średnika.
MillsJROSS,

8
Moja odpowiedź dotyczy tylko definicji funkcji, takich jak dwa przykłady pytania. W takich przypadkach średnik kończący nie jest potrzebny w żadnej przeglądarce, w żadnej sytuacji. Myślę, że możesz myśleć o wyrażeniach funkcji. To zupełnie inna sprawa, a nie ta, która została poruszona w pierwotnym pytaniu.
David Hedlund,

var myFunction = function (arg) {console.log (arg); } (function () {console.log („funkcja całkowicie niepowiązana”); zwraca „zobacz, co się stanie”;} ());
Maciej Krawczyk

@MillsJROSS Popieram odpowiedź Davida i byłbym szczęśliwy, gdybyś opracował opisaną przez ciebie porażkę. Czy rzeczywiście było to wyrażenie funkcyjne lub błąd IE?
wlnirvana

7

Po prostu bądź konsekwentny! Nie są potrzebne, ale ja osobiście ich używam, ponieważ większość technik minifikacji opiera się na średniku (na przykład Packerze ).


5

Naprawdę zależy tylko od twoich preferencji. Lubię kończyć wiersze kodu średnikami, ponieważ jestem przyzwyczajony do Java, C ++, C # itd., Więc używam tych samych standardów do kodowania w javascript.

Zwykle jednak nie kończę deklaracji funkcji średnikami, ale to tylko moje preferencje.

Przeglądarki będą działać tak czy inaczej, ale może kiedyś wymyślą bardziej rygorystyczne normy.

Przykład kodu, który napisałbym:

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

1
wiersze powinny zdecydowanie kończyć się średnikami, tho. w przeciwnym razie minutnik może całkowicie zepsuć funkcjonalność
David Hedlund,

9
@david: w takim razie minizator jest zepsuty, na pewno?
DisgruntledGoat,

Zgoda. Jest to naturalny sposób kodowania dla osób (takich jak ja) pochodzących z środowisk C / C ++. Dzięki temu kod jest bardziej czytelny.
Anshuman Manral,

3

W rzeczywistości jest to coś więcej niż kwestia konwencji lub spójności.

Jestem całkiem pewien, że nie umieszczanie średników po każdej instrukcji spowalnia wewnętrzny parser, ponieważ musi dowiedzieć się, gdzie jest koniec instrukcji. Chciałbym mieć jakieś przydatne numery, abyś mógł to pozytywnie potwierdzić, ale może sam możesz to zrobić w Google. :)

Ponadto, gdy kompresujesz lub minimalizujesz kod, brak średników może prowadzić do zminimalizowanej wersji skryptu, która nie robi tego, co chciałeś, ponieważ cała biała przestrzeń znika.


3
Pytanie dotyczyło tego, czy średniki muszą występować po funkcjach, a nie w każdym stwierdzeniu. Zgadzam się, że powinieneś umieszczać średniki po każdym stwierdzeniu i widziałem inny konsensus dotyczący przepełnienia stosu, który mówi to samo.
macca1,

1
Zgadzam się, a nie umieszczanie średników po funkcjach spowoduje problem z minifikacją, o którym wspomniałem. Powodzenia, proszę pana.
Mason

Upvote, ponieważ wzmocnienie problemu minimalizacji wyjaśniło moje zrozumienie
JackW327

1

Kiedy zminimalizowałem swoje skrypty, zdałem sobie sprawę, że muszę używać średnika dla funkcji, które zaczynają się od znaku równości. jeśli zdefiniujesz funkcję jako var, tak, musisz użyć średnika.

potrzebujesz średnika

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

nie trzeba średnika

function x(){}

0

PROSTY:

Dobrą praktyką jest pozostawianie średników ;po zakończeniu nawiasów klamrowych funkcji. Od lat są uważane za najlepszą praktykę.

Jedną z zalet korzystania z nich jest zawsze, gdy chcesz zminimalizować JavaScript.

Minimalizując JavaScript, pomaga nieco zmniejszyć rozmiar pliku.

Ale jeśli chodzi o najlepszą praktykę i powyższą odpowiedź, nie zaleca się używania jej po znaczniku funkcji.

Jeśli NIE użyjesz średników i jeśli chcesz zmniejszyć (jak wielu programistów lubi robić, jeśli ich witryna obsługuje dużo JavaScript), możesz uzyskać różnego rodzaju błędy / ostrzeżenia.


0

średnik po funkcji nie jest konieczny przy jej użyciu lub nie, nie powoduje błędów w twoim programie. jeśli jednak planujesz zminimalizować swój kod, dobrym pomysłem jest użycie średników po funkcjach. powiedzmy na przykład, że masz kod podobny do tego poniżej

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

i

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

kiedy zminimalizujesz oba, otrzymasz następujące dane wyjściowe

Pamiętaj, że komentarze służą wyłącznie ilustracji

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

i

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.