Cosa fa il punto e virgola principale nelle librerie JavaScript?


156

In diverse librerie JavaScript ho visto questa notazione all'inizio:

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

Mentre mi trovo perfettamente a mio agio con la sintassi della "funzione eseguita immediatamente"

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

Mi chiedevo a cosa servisse il punto e virgola principale. Tutto quello che ho potuto escogitare è che si tratta di un'assicurazione. Vale a dire, se la libreria è incorporata in un altro codice errato, funge da "l'ultimo enunciato finisce qui all'ultimo" tipo di speed bump.

Ha qualche altra funzionalità?


Risposte:


140

Ti consente di concatenare in modo sicuro più file JavaScript in uno, per servirlo più velocemente come una richiesta HTTP.


16
Ma non sarebbe necessario, se tutti i file fossero codificati correttamente, vero?
Boldewyn,

8
No: nel tuo esempio, otterrai (function(){...})()(function(){...})().
Aaron Digulla,

8
Che intendevo con "codificato correttamente", che ogni libreria termina con la giusta quantità di punti e virgola finali ...
Boldewyn,

6
Sì, Boldewyn, ma semplicemente non è così.
Mathias Bynens,

13
Due file con codici errati non saranno adatti solo per il fatto che un terzo file contiene questa correzione sporca. Perché il concatenatore non può aggiungere punti e virgola aggiuntivi tra i file nel risultato?
Dávid Horváth,

30

La migliore risposta è stata effettivamente data nella domanda, quindi scriverò qui per chiarezza:

Il primo ;di fronte alle espressioni di funzione immediatamente invocate è lì per prevenire errori quando si aggiunge il file durante la concatenazione a un file contenente un'espressione non correttamente terminata con a ;.

È consigliabile terminare le espressioni con punti e virgola, ma utilizzare anche il punto e virgola principale come protezione.


Perché terminare anche le espressioni con punti e virgola, se si utilizzano punti e virgola difensivi? O hai la possibilità di fare affidamento sul fatto che i punti e virgola siano presenti alla fine di ogni riga o usi i punti e virgola difensivi. Fare entrambe le cose porta le persone a concludere erroneamente che esiste un motivo per fare entrambe le cose. Il consiglio di usare il punto e virgola difensivo è buono; il consiglio di sostituire anche ogni istanza di "\n"con ";\n"non ha senso.
Vladimir Kornea,

4
@VladimirKornea: perché non usi sempre solo le tue librerie :)
jvenema,

@jvenema Non so perché pensi che faccia la differenza.
Vladimir Kornea,

6
Perché non puoi fare affidamento sul codice di qualcun altro seguendo le tue convenzioni. Codice difensivo e quindi non è necessario.
jvenema,

1
@VladimirKornea Puoi pensarlo anche come difensivo, se vuoi - difende dal codice di qualcun altro che non inizia sempre con punti e virgola difensivi.
Nathan Hinchey,

26

In generale, se un'istruzione inizia con (, [, /, + o -, esiste la possibilità che possa essere interpretata come una continuazione dell'istruzione precedente. Le dichiarazioni che iniziano con /, + e - sono piuttosto rare nella pratica , ma le istruzioni che iniziano con (e [non sono affatto rare, almeno in alcuni stili di programmazione JavaScript. Ad alcuni programmatori piace mettere un punto e virgola difensivo all'inizio di una tale dichiarazione in modo che continui a funzionare correttamente anche se l'istruzione prima che venga modificato e rimosso un punto e virgola precedentemente terminato:

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

Fonte:

JavaScript: The Definitive Guide, 6th edition


9

Questo è indicato come punto e virgola iniziale.

Il suo scopo principale è proteggersi dal codice precedente che era stato chiuso in modo improprio, il che può causare problemi. Un punto e virgola impedirà che ciò accada. Se il codice precedente è stato chiuso in modo errato, il nostro punto e virgola lo correggerà. Se fosse correttamente chiuso, il nostro punto e virgola sarà innocuo e non ci saranno effetti collaterali.


7

Una risposta di una riga è quella di concatenare in modo sicuro più file JavaScript. L'uso di un punto e virgola non solleva un problema.

Supponiamo di avere più funzioni:

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

Sulla concatenazione può apparire come:

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

Ma se aggiungi un punto e virgola prima della funzione sarà simile a:

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

Quindi aggiungendo un ;, si prende cura se qualsiasi espressione non è correttamente terminata.

Esempio 2

Supponiamo di avere un file JavaScript con una variabile:

var someVar = "myVar"

Un altro file JavaScript con alcune funzioni:

(function(){})()

Ora sulla concatenazione sembrerà

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

Con un punto e virgola, sarà simile a:

var someVar = "myVar";(function(){})()

4

È utile quando si minimizza il codice JavaScript. Previene errori di sintassi imprevisti.


Tipo cosa? Il punto e virgola ha qualche significato per il seguente codice o è solo per un ipotetico codice errato unito alla libreria attuale?
Boldewyn,

In quel solo codice, nessun significato speciale, ma quando quel codice è nel mezzo di altri codici e quando lo minimizzi su una singola riga, ci possono essere errori imprevisti, come (1) punto e virgola mancante nelle righe precedenti, (1 ) una precedente è anche una funzione, quindi sarà () () () (), quando si ottiene un errore, difficile da eseguire il debug, non possiamo dirlo con errori, perché prima di minimizzare il suo corretto funzionamento.
VOI

1
Ma sicuramente è responsabilità del minificatore gestirlo correttamente. Al giorno d'oggi i minifornitori con buggy sono la norma?
Vladimir Kornea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.