Was macht das führende Semikolon in JavaScript-Bibliotheken?

156

In mehreren JavaScript-Bibliotheken habe ich diese Notation ganz am Anfang gesehen:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

Während ich mit der Syntax "sofort ausgeführte Funktion" vollkommen vertraut bin

(function(){...})()

Ich habe mich gefragt, wofür das führende Semikolon ist. Ich könnte mir nur vorstellen, dass es sich um eine Versicherung handelt. Das heißt, wenn die Bibliothek in anderen fehlerhaften Code eingebettet ist, dient sie als Geschwindigkeitsbegrenzung "Die letzte Anweisung endet hier spätestens".

Hat es noch andere Funktionen?

Boldewyn
quelle

Antworten:

140

Sie können mehrere JavaScript-Dateien sicher zu einer verketten, um sie schneller als eine HTTP-Anforderung bereitzustellen.

Kornel
quelle
16
Aber es wäre nicht notwendig, wenn alle Dateien korrekt codiert wären, oder?
Boldewyn
8
Nein: In Ihrem Beispiel würden Sie bekommen (function(){...})()(function(){...})().
Aaron Digulla
8
Das habe ich mit "richtig codiert" gemeint, dass jede Bibliothek mit der richtigen Anzahl von nachgestellten Semikolons endet ...
Boldewyn
6
Ja, Boldewyn, aber das ist einfach nicht der Fall.
Mathias Bynens
13
Zwei schlecht codierte Dateien passen nicht nur aufgrund der Tatsache, dass eine dritte Datei diesen schmutzigen Fix enthält. Warum kann der Verketter dem Ergebnis keine zusätzlichen Semikolons zwischen Dateien hinzufügen?
Dávid Horváth
30

Die beste Antwort wurde tatsächlich in der Frage gegeben, deshalb werde ich das hier zur Klarheit nur aufschreiben:

Der Hinweis ;vor sofort aufgerufenen Funktionsausdrücken dient dazu, Fehler beim Anhängen der Datei während der Verkettung an eine Datei zu vermeiden, die einen Ausdruck enthält, der nicht ordnungsgemäß mit a abgeschlossen wurde ;.

Es wird empfohlen, Ihre Ausdrücke mit Semikolons zu beenden, aber auch das führende Semikolon als Schutz zu verwenden.

holographisches Prinzip
quelle
Warum sollten Sie Ihre Ausdrücke auch mit Semikolons beenden, wenn Sie defensive Semikolons verwenden? Entweder nutzen Sie die Chance, sich darauf zu verlassen, dass am Ende jeder Zeile Semikolons stehen, oder Sie verwenden defensive Semikolons. Wenn man beides tut, kommt man fälschlicherweise zu dem Schluss, dass es einen Grund gibt, beides zu tun. Der Rat, defensive Semikolons zu verwenden, ist gut. Der Rat, auch jede Instanz von "\n"durch zu ersetzen, ";\n"macht keinen Sinn.
Vladimir Kornea
4
@ VladimirKornea: weil Sie nicht immer nur Ihre eigenen Bibliotheken verwenden :)
Jvenema
@jvenema Ich weiß nicht, warum du denkst, dass das einen Unterschied macht.
Vladimir Kornea
6
Weil Sie sich nicht auf den Code eines anderen verlassen können, der Ihren Konventionen entspricht. Code defensiv und dann müssen Sie nicht.
Jvenema
1
@VladimirKornea Sie können sich das auch als defensiv vorstellen, wenn Sie möchten - es verteidigt sich gegen den Code eines anderen, der nicht immer mit defensiven Semikolons beginnt.
Nathan Hinchey
26

Wenn eine Anweisung mit (, [, /, + oder - beginnt, besteht im Allgemeinen die Möglichkeit, dass sie als Fortsetzung der vorherigen Anweisung interpretiert wird. Anweisungen, die mit /, + und - beginnen, sind in der Praxis recht selten , aber Anweisungen, die mit (und [beginnen, sind zumindest in einigen Stilen der JavaScript-Programmierung keine Seltenheit. Einige Programmierer setzen am Anfang einer solchen Anweisung ein defensives Semikolon, damit sie auch dann ordnungsgemäß funktioniert, wenn die Anweisung korrekt ist bevor es geändert und ein zuvor abschließendes Semikolon entfernt wird:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

Quelle:

JavaScript: The Definitive Guide, 6. Ausgabe

Faraz Kelhini
quelle
9

Dies wird als führendes Semikolon bezeichnet.

Sein Hauptzweck ist es, sich vor vorherigem Code zu schützen, der nicht ordnungsgemäß geschlossen wurde, was zu Problemen führen kann. Ein Semikolon verhindert dies. Wenn der vorhergehende Code nicht ordnungsgemäß geschlossen wurde, korrigiert unser Semikolon dies. Wenn es richtig geschlossen wurde, ist unser Semikolon harmlos und es treten keine Nebenwirkungen auf.

bvmCoder
quelle
7

Eine einzeilige Antwort besteht darin, mehrere JavaScript-Dateien sicher zu verketten. Die Verwendung eines Semikolons wirft kein Problem auf.

Angenommen, Sie haben mehrere Funktionen:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

Bei der Verkettung kann es so aussehen:

(function(){})()(function(){})()

Wenn Sie jedoch vor der Funktion ein Semikolon hinzufügen, sieht es folgendermaßen aus:

;(function(){})();(function(){})()

Also durch Hinzufügen eines ; wird also darauf geachtet, dass ein Ausdruck nicht ordnungsgemäß beendet wird.

Beispiel 2

Angenommen, Sie haben eine JavaScript-Datei mit einer Variablen:

var someVar = "myVar"

Eine weitere JavaScript-Datei mit einigen Funktionen:

(function(){})()

Jetzt bei der Verkettung wird es so aussehen

var someVar = "myVar"(function(){})() // It may give rise to an error

Mit einem Semikolon sieht es so aus:

var someVar = "myVar";(function(){})()
brk
quelle
4

Es ist gut, wenn Sie JavaScript-Code minimieren. Es verhindert unerwartete Syntaxfehler.

SIE
quelle
Wie was? Hat das Semikolon eine Bedeutung für den folgenden Code oder ist es nur für hypothetischen Buggy-Code, der vor der eigentlichen Bibliothek zusammengeführt wurde?
Boldewyn
In diesen Codes allein gibt es keine besondere Bedeutung, aber wenn sich dieser Code in der Mitte anderer Codes befindet und Sie ihn auf eine einzelne Zeile verkleinern, kann es zu unerwarteten Fehlern kommen, z. B. (1) Semikolon fehlt in vorherigen Zeilen, (1 ) Vorherige ist auch Funktionen, so dass es () () () () sein wird, wenn Fehler, schwer zu debuggen, können wir nicht sagen, dass es fehlerhaft ist, weil vor dem Minimieren es gut läuft.
SIE
1
Aber es liegt sicherlich in der Verantwortung des Minifier, dies richtig zu handhaben. Sind Buggy-Minifahrer heutzutage die Norm?
Vladimir Kornea