Pregunta

Me he dado cuenta recientemente de que una gran cantidad de archivos JavaScript en la web se inicia con una ; inmediatamente después de la sección de comentarios.

Por ejemplo, código de este plugin jQuery comienza 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( $ ){

¿Por qué necesita para comenzar con un ; el archivo? Veo esta convención en los archivos de JavaScript del lado del servidor también.

¿Cuáles son las ventajas y desventajas de hacer esto?

¿Fue útil?

Solución

Yo diría que desde guiones a menudo se concatenan y se minified / comprimido / enviada junto hay una posibilidad de que el último chico tenía algo como:

return {
   'var':'value'
}

al final de la última secuencia de comandos sin ; en el extremo. Si usted tiene un ; al comienzo de la suya, es seguro, ejemplo:

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

Otros consejos

Creo (aunque no estoy seguro, así que por favor no saltar sobre mí) de que esto aseguraría ninguna declaración previa de un archivo diferente está cerrado. En el peor de los casos, esto sería una declaración vacía, pero en el mejor de los casos podría evitar tratando de localizar a un error en este archivo cuando la declaración sin terminar en realidad vino de arriba.

Considere este ejemplo:

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

Lo que sucederá es que se evalúa del siguiente modo:

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

Así que lo que cada vez está volviendo a serán tratados como una función de un tratado de ser inicializado.

Esto es sobre todo para evitar errores al intentar concat archivos se multiplican en un solo archivo:

a.js

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

b.js

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

Si ConCat estos archivos juntos causará problemas.

Así que, por tanto, recuerde que debe poner su ; frente a ( y tal vez también algunos otros lugares. Por cierto. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; es perfectamente válido JavaScript

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top