2009-12-09 8 views
133

In diverse librerie JavaScript Ho visto questa notazione, proprio all'inizio:Che cosa fa il punto e virgola leader nelle librerie JavaScript?

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

Mentre io sono perfettamente a suo agio con la funzione "immediatamente eseguito" sintassi

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

Mi chiedevo che cosa il punto e virgola iniziale è per. Tutto quello che potrei inventare è che è un'assicurazione. Cioè, se la libreria è incorporata in un altro codice buggato, funge da "l'ultima affermazione finisce qui all'ultimo tipo" di speed bump.

Ha altre funzionalità?

+6

Penso che tu abbia già la risposta giusta: c'è molto buggy JavaScript nel mondo, quindi l'assicurazione è importante. – kdgregory

risposta

120

Consente di concatenare in modo sicuro diversi file JS in uno, per servirlo più rapidamente come una richiesta HTTP.

+12

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

+5

No: nel tuo esempio, otterrai '(function() {...})() (function() {...})()'. –

+6

Che intendevo con 'codificato correttamente', che ogni libreria termina con la quantità corretta di punti e virgola finali ... – Boldewyn

4

È utile quando si minimizzano i codici js. Impedisci errori di sintassi imprevisti.

+0

Come cosa? Il punto e virgola ha qualche significato per il codice seguente o è solo per codice buggy ipotetico fuso davanti alla libreria effettiva? – Boldewyn

+0

In, quel codice da solo, nessun significato speciale, ma quando quel codice è nel mezzo di altri codici e quando lo si riduce a una singola riga, ci possono essere errori imprevisti, come (1) il punto e virgola manca nelle righe precedenti, (1) quello precedente è anche funzioni quindi sarà()()()(), quando si verifica un errore, difficile eseguire il debug, non possiamo dire che sia bacato, perché prima di ridurlo va bene. – YOU

+1

Ma sicuramente è responsabilità del minificatore gestirlo correttamente. Oggigiorno i minifattori sono buggy? –

24

La migliore risposta è stato effettivamente dato in questione, quindi mi limiterò a scrivere che qui per chiarezza:

Il leader ; di fronte a espressioni di funzione immediatamente, invocate è lì per evitare errori quando si aggiunge il file durante concatenazione a un file contenente un'espressione non correttamente terminata con uno ;.

La procedura ottimale consiste nel terminare le espressioni con il punto e virgola, ma anche utilizzare il punto e virgola principale come salvaguardia.

+0

Perché anche terminare le espressioni con punto e virgola, se si utilizza il punto e virgola difensivo? O hai la possibilità di fare affidamento sul punto e virgola che si trova alla fine di ogni riga, o di usare il punto e virgola difensivo. Fare entrambe le cose porta erroneamente a concludere che c'è 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. –

+2

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

+0

@jvenema Non so perché pensi che faccia la differenza. –

20

In generale, se una dichiarazione inizia con (, [, /, + o -., C'è una possibilità che potrebbe essere interpretato come una continuazione della dichiarazione prima dichiarazioni che iniziano con /, +, e - sono piuttosto rari nella pratica, ma le dichiarazioni iniziano con (e [non sono inusuali affatto, almeno in alcuni stili di programmazione JavaScript.Alcuni programmatori come mettono un punto e virgola difensivo all'inizio di una tale dichiarazione in modo che sarà continuare a funzionare correttamente anche se l'istruzione precedente viene modificata e un punto e virgola in precedenza rimosso:

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

6

Questo è indicato come un punto e virgola di primo piano.

Il suo scopo principale è quello di proteggersi dal codice precedente che è stato chiuso in modo non corretto, 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 è stato chiuso correttamente, il nostro punto e virgola sarà innocuo e non ci saranno effetti collaterali.