web-dev-qa-db-fra.com

Pourquoi le JavaScript doit-il commencer par ";"?

J'ai récemment remarqué que de nombreux fichiers JavaScript sur le Web commencent par un ; immédiatement après la section des commentaires.

Par exemple, ce plugin jQuery 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-il commencer par un ;? Je vois également cette convention dans les fichiers JavaScript côté serveur.

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

216
TK.

Je dirais que puisque les scripts sont souvent concaténés et minifiés/compressés/envoyés ensemble, il y a une chance que le dernier gars ait quelque chose comme:

return {
   'var':'value'
}

à la fin du dernier script sans ; a la fin. Si tu as un ; au début sur le vôtre, c'est sûr, par 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
350
Nick Craver

Je crois (bien que je ne sois pas certain, alors ne vous précipitez pas sur moi) que cela garantirait la fermeture de toute déclaration antérieure d'un autre dossier. Dans le pire des cas, il s'agirait d'une instruction vide, mais dans le meilleur des cas, cela pourrait éviter d'essayer de rechercher une erreur dans ce fichier lorsque l'instruction inachevée provenait réellement d'en haut.

56
Jerry Bullard

Considérez cet exemple:

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

Ce qui va arriver, c'est qu'il sera évalué comme ceci:

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

Ainsi, tout ce que a retourne sera traité comme une fonction essayée d'être initialisée.

C'est principalement pour éviter les erreurs lors de la tentative de concaténation de fichiers multiples en un seul fichier:

a.js

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

b.js

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

Si nous concaténons ces fichiers ensemble, cela entraînera des problèmes.

Pensez donc à mettre votre ; devant de ( et peut-être aussi quelques autres endroits. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b; est un JavaScript parfaitement valide

12
andlrc