Perché JavaScript deve iniziare con “;”?


218

Di recente ho notato che molti file JavaScript sul Web iniziano con una ;sezione di commento immediatamente successiva.

Ad esempio, il codice di questo plugin jQuery inizia con:

/**
 * jQuery.ScrollTo
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008                                      
 .... skipping several lines for brevity...
 *
 * @desc Scroll on both axes, to different values
 * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
 */
;(function( $ ){

Perché il file deve iniziare con un ;? Vedo questa convenzione anche nei file JavaScript sul lato server.

Quali sono i vantaggi e gli svantaggi di farlo?

Risposte:


352

Direi che poiché gli script sono spesso concatenati e minimizzati / compressi / inviati insieme c'è una possibilità che l'ultimo ragazzo abbia avuto qualcosa del tipo:

return {
   'var':'value'
}

alla fine dell'ultimo script senza un ;alla fine. Se hai un ;all'inizio sul tuo, è sicuro, ad esempio:

return {
   'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)

return {
   'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!

return {
   'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm

8
In realtà non puoi avere una returndichiarazione come l'ultima cosa in una sceneggiatura, vero? Tornare ai massimi livelli non ha senso. Dovrebbe essere qualcos'altro, giusto?
user2357112 supporta Monica

3
@ user2357112 A maggior ragione, il codice doporeturn un'affermazione non ottenere eseguito, in modo che non ha senso per concatenare. Almeno }manca.
Robert,

57

Credo (anche se non ne sono certo, quindi per favore non balzarti addosso) che ciò assicurerebbe la chiusura di qualsiasi precedente dichiarazione di un altro file. Nel peggiore dei casi, questa sarebbe un'istruzione vuota, ma nel migliore dei casi potrebbe evitare di cercare di rintracciare un errore in questo file quando l'istruzione incompleta in realtà proviene dall'alto.


9
Non ne sono sicuro al 100% ma sono con te su questo, Jerry.
Ok

12

Considera questo esempio:

function a() {
  /* this is my function a */
}
a()
(function() {
  /* This is my closure */
})()

Quello che accadrà è che sarà valutato in questo modo:

function a() {
  /* this is my function a */
}
a()(function() {})()

Quindi, qualunque cosa aritorni verrà trattata come una funzione che si tenta di inizializzare.

Ciò serve principalmente a prevenire errori quando si tenta di concatenare file multipli in un unico file:

a.js

function a() {
  /* this is my function a */
}
a()

b.js

(function() {
  /* This is my closure */
})()

Se concatichiamo questi file insieme, si verificheranno problemi.

Quindi ricorda di metterti ;di fronte (e forse anche in altri posti. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;è JavaScript perfettamente valido

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.