Warum sollte ich nach jeder Funktion in Javascript ein Semikolon verwenden?

282

Ich habe gesehen, dass verschiedene Entwickler Semikolons nach Funktionen in Javascript einfügen und einige nicht. Welches ist die beste Vorgehensweise?

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

oder

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

Antworten:

424

Semikolons nach Funktionsdeklarationen sind nicht erforderlich .

Die Grammatik von a FunctionDeclarationwird in der Spezifikation wie folgt beschrieben :

function Identifier ( FormalParameterListopt ) { FunctionBody }

Es ist kein Semikolon grammatikalisch erforderlich, aber fragen Sie sich vielleicht warum?

Semikolons dienen dazu, Aussagen voneinander zu trennen, und a FunctionDeclarationist keine Aussage .

FunctionDeclarationswerden ausgewertet, bevor der Code ausgeführt wird. Heben ist ein gebräuchliches Wort , um dieses Verhalten zu erklären.

Die Begriffe "Funktionsdeklaration" und "Funktionsanweisung" werden häufig fälschlicherweise synonym verwendet, da in der ECMAScript-Spezifikation keine Funktionsanweisung beschrieben ist. Es gibt jedoch einige Implementierungen, die eine Funktionsanweisung in ihrer Grammatik enthalten, insbesondere Mozilla ist nicht Standard.

Es werden jedoch immer Semikolons empfohlen, wenn Sie FunctionExpressionsbeispielsweise Folgendes verwenden :

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

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

Wenn Sie das Semikolon nach der ersten Funktion im obigen Beispiel weglassen, erhalten Sie völlig unerwünschte Ergebnisse:

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

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

Die erste Funktion wird sofort ausgeführt, da die Klammern, die die zweite umgeben, als ArgumentsFunktionsaufruf interpretiert werden .

Empfohlene Vorträge:

CMS
quelle
2
Zur Verdeutlichung bearbeitet, spricht dieser Artikel über Funktionsausdrücke
CMS
1
Nicht ganz vertraut mit ECMA, aber das ist der Standard, den ich auch verwende. Guter Post. Die meisten Tuts, die ich online sehe, und Codebeispiele, die ich DL verwende, verwenden diesen Standard, daher habe ich mich gerade daran angepasst.
Regex
1
Ein Teil der Verwirrung hier kann durch das Fehlen eines guten englischen Wortes für "erlaubt, weil es ignoriert wird" beeinflusst werden. Wir greifen auf "optional" zurück, aber das ist irreführend, da es darauf hindeutet, dass das Nichteinschließen eines Semikolons nach einer Deklaration in dieselbe Kategorie fällt wie das Nichteinschließen eines Semikolons nach einer Anweisung. Letzteres ist in einem ganz anderen Sinne optional: Es liegt daran, dass der Parser das fehlende Semikolon hinzufügt, das Sie ausgelassen haben , während in diesem Fall der Parser das von Ihnen eingeschlossene Semikolon ignoriert . Anders ausgedrückt: Wenn eins optional ist, sind es auch acht .
Semikolon
Der Link "Benannte Funktionsausdrücke entmystifiziert" verweist
Tony
Das letzte Beispiel ist großartig. Das Weglassen eines Semikolons führt in diesem Fall zu äußerst seltsamen und schwer zu debuggenden Fehlern. Von ganzem Herzen abstimmen.
Yan Yankowski
38

Ich benutze sie nach Deklarationen von Funktion als Variable:

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

aber nicht nach klassischen Definitionen:

function f() {
    ...
}
Gabe Moothart
quelle
NetBeans und andere IDEs möchten Semikolon nach einer Funktion als Variable wie this.animaton_fun = function () {...} sehen.
Lance Cleveland
6
Aber - für den Fragesteller - warum ?
Luke
Es hilft während des Build-Schritts. Wenn ein Uglifier-Skript ein Semikolon sieht, muss es der Ausgabedatei keinen Zeilenumbruch hinzufügen. Wenn dies nicht der Fall ist, wird ein Zeilenumbruch generiert und die Datei wird etwas größer.
Autoboxer
20

JS Lint ist eine De-facto-Konvention und sagt kein Semikolon nach dem Funktionskörper. Siehe den Abschnitt "Semikolon" .

David Hedlund
quelle
10
Ich habe aus erster Hand eine Funktion gesehen, die aufgrund eines fehlenden Semikolons fehlgeschlagen ist. Ich bin völlig anderer Meinung, dass es eine Konvention ist, es wegzulassen. Während es in 99,99% der Fälle nicht kaputt geht, gibt es bestimmte Situationen, in denen ich festgestellt habe, dass der IE JavaScript ohne das Semikolon nicht interpetieren konnte.
MillsJROSS
8
Meine Antwort befasst sich nur mit Funktionsdefinitionen wie in den beiden Beispielen der Frage. In diesen Fällen wird in keinem Browser und in keiner Situation ein abschließendes Semikolon benötigt . Ich denke, Sie denken vielleicht an Funktionsausdrücke. Sie sind eine ganz andere Sache und keine, die in der ursprünglichen Frage angesprochen wurde.
David Hedlund
var myFunction = function (arg) {console.log (arg); } (function () {console.log ('völlig unabhängige Funktion'); return 'sehen, was passiert';} ());
Maciej Krawczyk
@MillsJROSS Ich stimme Davids Antwort zu und würde mich freuen, wenn Sie den Fehler erläutern, auf den Sie gestoßen sind. War es tatsächlich ein Funktionsausdruck oder ein Fehler des IE?
wlnirvana
7

Bleib einfach konsequent! Sie werden nicht benötigt, aber ich persönlich verwende sie, da die meisten Minifizierungstechniken auf dem Semikolon basieren (z. B. Packer ).

Josh Stodola
quelle
5

Kommt wirklich nur auf deine Vorlieben an. Ich mag es, Codezeilen mit Semikolons zu beenden, weil ich an Java, C ++, C # usw. gewöhnt bin. Daher verwende ich dieselben Standards für die Codierung in Javascript.

Normalerweise beende ich Funktionsdeklarationen nicht in Semikolons, aber das ist nur meine Präferenz.

Die Browser werden es so oder so ausführen, aber vielleicht werden sie eines Tages strengere Standards finden, die dies regeln.

Beispiel für Code, den ich schreiben würde:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}
Regex
quelle
1
Zeilen sollten auf jeden Fall mit Semikolons abgeschlossen werden. Andernfalls könnte ein Minifier die Funktionalität vollständig
David Hedlund
9
@ David: In diesem Fall ist der Minifier sicher kaputt?
DisgruntledGoat
Einverstanden. Es ist eine natürliche Art der Codierung für Personen (wie mich) mit C / C ++ - Hintergrund. Dadurch wird der Code auch besser lesbar.
Anshuman Manral
3

Es ist eigentlich mehr als eine Frage der Konvention oder Konsistenz.

Ich bin mir ziemlich sicher, dass das Platzieren von Semikolons nach jeder Anweisung den internen Parser verlangsamt, da er herausfinden muss, wo sich das Ende der Anweisung befindet. Ich wünschte, ich hätte ein paar nützliche Zahlen, mit denen Sie das positiv bestätigen könnten, aber vielleicht können Sie es selbst googeln. :) :)

Wenn Sie Code komprimieren oder minimieren, kann ein Mangel an Semikolons zu einer minimierten Version Ihres Skripts führen, die nicht das tut, was Sie wollten, da der gesamte Leerraum verschwindet.

Mason
quelle
3
Die Frage war darauf ausgerichtet, ob Semikolons nach Funktionen stehen müssen, nicht nach jeder Aussage. Ich bin damit einverstanden, dass Sie nach jeder Anweisung Semikolons einfügen, und ich habe einen anderen Stackoverflow-Konsens gesehen, der dasselbe sagt.
Macca1
1
Wenn Sie zustimmen und keine Semikolons nach Funktionen setzen, führt dies zu dem von mir erwähnten Minimierungsproblem. Viel Glück, Sir.
Mason
Upvote, weil die Verstärkung des
Minifizierungsproblems
1

Als ich meine Skripte verkleinerte, wurde mir klar, dass ich für Funktionen, die mit der Gleichheitsnote beginnen, ein Semikolon verwenden muss. Wenn Sie eine Funktion als var definieren, müssen Sie ein Semikolon verwenden.

brauche Semikolon

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

kein Semikolon erforderlich

function x(){}
Senera
quelle
0

EINFACH:

Es wird empfohlen, die Semikolons ;nach dem Ende der Funktionsklammern zu belassen. Sie gelten seit Jahren als Best Practice.

Ein Vorteil der ständigen Verwendung besteht darin, dass Sie Ihr JavaScript minimieren möchten.

Durch die Minimierung von Javascript wird die Dateigröße etwas reduziert.

Die oben empfohlene Vorgehensweise und Antwort wird jedoch nicht empfohlen, sie nach einem Funktionstag zu verwenden.

Wenn Sie KEINE Semikolons verwenden und minimieren möchten (wie es viele Entwickler gerne tun, wenn ihre Website viel JavaScript enthält), können alle möglichen Fehler / Warnungen angezeigt werden.

Shaze
quelle
0

Das Semikolon nach einer Funktion, die nicht verwendet werden muss oder nicht, verursacht keine Fehler in Ihrem Programm. Wenn Sie jedoch vorhaben, Ihren Code zu minimieren, ist die Verwendung von Semikolons nach Funktionen eine gute Idee. Nehmen wir zum Beispiel an, Sie haben Code wie den folgenden

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

und

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

Wenn Sie beide minimieren, erhalten Sie Folgendes als Ausgabe

Beachten Sie, dass Kommentare nur zur Veranschaulichung dienen

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

und

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