¿Por qué el JavaScript necesita comenzar con";"?


Recientemente he notado que muchos archivos JavaScript en la Web comienzan con un ; inmediatamente después de la sección de comentarios.

Por ejemplo, el código de este complemento de 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é el archivo necesita comenzar con un ;? Veo esta convención en los archivos JavaScript del lado del servidor también.

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

Author: ЯegDwight, 2010-03-20

3 answers

Yo diría que dado que los scripts a menudo están concatenados y minificados / comprimidos / enviados juntos, existe la posibilidad de que el último tipo tuviera algo como:

return {
   'var':'value'
}

Al final del último script sin ; al final. Si tienes un ; al principio en el tuyo, 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
 349
Author: Nick Craver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 20:41:34

Creo (aunque no estoy seguro, así que por favor no se abalance sobre mí) que esto aseguraría que cualquier declaración previa de un archivo diferente esté cerrada. En el peor de los casos, esto sería una instrucción vacía, pero en el mejor de los casos podría evitar intentar rastrear un error en este archivo cuando la instrucción inacabada realmente vino de arriba.

 56
Author: Jerry Bullard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-20 01:39:00

Considere este ejemplo:

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

Lo que sucederá es que será evaluado así:

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

Así que lo que sea que esté regresando a será tratado como una función que se intenta inicializar.

Esto es principalmente para evitar errores al tratar de concat multiplicar archivos en un solo archivo:

A. js

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

B. js

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

Si juntamos estos archivos causará problemas.

Por Lo tanto, recuerde poner su ; delante de ( y tal vez también algunos otros lugares. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; es perfectamente válido JavaScript

 12
Author: andlrc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-04 14:33:51