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




title css (4)

Considera 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() {})()

Por lo tanto, lo que sea que se devuelva se tratará como una función que se intentará inicializar.

Esto se debe principalmente a evitar errores al intentar reunir múltiples archivos 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 lo tanto recuerda poner tu ; delante de ( y quizás también en algunos otros lugares. Por cierto. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; es perfectamente válido JavaScript

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 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é el archivo debe comenzar con un ; ? También veo esta convención en los archivos JavaScript del lado del servidor.

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


Creo (aunque no estoy seguro, así que, por favor, no se lance sobre mí) que esto garantizaría que cualquier declaración anterior de un archivo diferente se cierre. En el peor de los casos, esto sería una declaración vacía, pero en el mejor de los casos, podría evitar intentar localizar un error en este archivo cuando la declaración sin terminar provenga de arriba.


Diría que, dado que los scripts a menudo se concatenan y minimizan / comprimen / envían juntos, existe la posibilidad de que el último tipo tenga algo como:

return {
   'var':'value'
}

al final de la última secuencia de comandos sin un ; 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

Evita que se utilice como objetivo de una etiqueta <script> simple. (Bueno, no lo impide, pero lo hace desagradable). De esa manera, los malos no pueden simplemente poner esa etiqueta de script en su propio sitio y confiar en una sesión activa para hacer posible recuperar su contenido.

editar - note el comentario (y otras respuestas). El problema tiene que ver con las instalaciones incorporadas subvertidas, específicamente los constructores Object y Array . Se pueden alterar de tal manera que, de otro modo, el JSON inocuo, cuando se analiza, podría desencadenar el código del atacante.





javascript jquery jquery-plugins serverside-javascript