217 votes

Pourquoi le JavaScript besoin de commencer avec ";"?

J'ai récemment remarqué qu'un grand nombre de fichiers JavaScript sur le Web commencer avec un ; immédiatement après la section des commentaires.

Par exemple, ce plugin jQuery de code commence par:

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

Pourquoi le fichier doit commencer par un ;? Je vois la présente convention en JavaScript côté serveur de fichiers.

Quels sont les avantages et les inconvénients de le faire?

351voto

Nick Craver Points 313913

Je dirais depuis les scripts sont souvent concaténés et minifiés/comprimé/envoyé il y a une chance que le dernier gars avait quelque chose comme:

return {
   'var':'value'
}

à la fin de la dernière script sans ; sur la fin. Si vous avez un ; au début sur le vôtre, c'est sûr, exemple:

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

56voto

Jerry Bullard Points 5446

Je crois (mais je ne suis pas certain, donc merci de ne pas bondir sur moi) que ce serait de veiller à ce que toute déclaration antérieure d'un autre fichier est fermé. Dans le pire des cas, ce serait une instruction vide, mais dans le meilleur des cas, cela pourrait éviter d'essayer de traquer une erreur dans ce fichier lors de l'inachevé instruction est venu d'en haut.

12voto

NULL Points 10442

Considérons cet exemple:

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

Ce qui va se passer c'est qu'il va être évalué comme suit:

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

Donc, ce que jamais a est de retour sera considéré comme une fonction d'un a essayé d'être initialisé.

C'est surtout pour éviter les erreurs lorsque vous essayez de concat multiplier les fichiers en un seul fichier:

un.js

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

b.js

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

Si nous concat ces fichiers ensemble, il va causer des problèmes.

Donc n'oubliez pas de mettre votre ; face ( et peut-être aussi un peu d'autres endroits. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; est parfaitement valide JavaScript

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X