Domanda

Di recente ho notato che un sacco di file JavaScript sul Web inizia con una ; subito dopo la sezione dei commenti.

Per esempio, 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 una ;? Vedo questa convenzione nel file JavaScript lato server pure.

Quali sono i vantaggi e gli svantaggi di fare questo?

È stato utile?

Soluzione

Direi poiché gli script sono spesso concatenati e minified / compressa / inviato insieme c'è una possibilità l'ultimo ragazzo aveva qualcosa di simile:

return {
   'var':'value'
}

alla fine dell'ultimo script senza un ; alla fine. Se si dispone di un ; alla partenza 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

Altri suggerimenti

Credo (anche se io non sono certo, quindi per favore non avventarsi su di me) che questo garantirebbe alcuna dichiarazione preventiva da un altro file viene chiuso. Nel peggiore dei casi, questa sarebbe una dichiarazione vuota, ma nel migliore dei casi si potrebbe evitare di cercare di rintracciare un errore in questo file quando l'istruzione non finito in realtà è venuto dall'alto.

Si consideri questo esempio:

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

Che cosa accadrà è che sarà valutato in questo modo:

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

Quindi, che cosa mai a sta tornando sarà trattato come una funzione di una cercato di essere inizializzato.

Questo è per lo più per evitare errori quando si cerca di concat file moltiplicano in un unico file:

a.js

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

b.js

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

Se concat questi file insieme causerà problemi.

Così dunque ricordatevi di mettere il ; davanti ( e magari anche un paio di altri posti. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; è perfettamente valido JavaScript

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top