Pergunta

Eu notei recentemente que muitos arquivos JavaScript na web começam com um ; imediatamente após a seção de comentários.

Por exemplo, este plugin jQuery O código começa com:

/**
 * 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( $ ){

Por que o arquivo precisa começar com um ;? Eu também vejo esta convenção nos arquivos JavaScript do lado do servidor.

Quais são as vantagens e desvantagens de fazer isso?

Foi útil?

Solução

Eu diria que, já que os scripts são frequentemente concatenados e minificados/compactados/enviados juntos, há uma chance de que o último cara tenha algo como:

return {
   'var':'value'
}

no final do último script sem um ; no fim. Se você tem um ; No início do seu, é seguro, exemplo:

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

Outras dicas

Acredito (embora não tenha certeza, então, por favor, não me jogue) que isso garantiria que qualquer declaração prévia de um arquivo diferente seja fechada. Na pior das hipóteses, essa seria uma declaração vazia, mas, na melhor das hipóteses, poderia evitar tentar rastrear um erro nesse arquivo quando a declaração inacabada veio de cima.

Considere este exemplo:

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

O que acontecerá é que ele será avaliado assim:

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

Então tanto faz a O retorno será tratado em função e tentado ser inicializado.

Isso é principalmente para evitar erros ao tentar concatar multiplicar arquivos em um arquivo:

A.JS

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

B.JS

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

Se concatarmos esses arquivos juntos, causará problemas.

Portanto, lembre -se de colocar o seu ; à frente de ( E talvez também alguns outros lugares. Por falar nisso. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; é perfeitamente válido JavaScript

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top