Pourquoi le JavaScript doit-il commencer par «;»?

218

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, le code de ce plugin jQuery 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?

TK.
la source

Réponses:

352

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 un ;à la fin. Si vous avez un ;au départ 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
Nick Craver
la source
8
Vous ne pouvez pas réellement avoir une returndéclaration comme dernière chose dans un script, n'est-ce pas? Revenir au plus haut niveau n'a pas de sens. Il faudrait que ce soit autre chose, non?
user2357112 prend en charge Monica
3
@ user2357112 Encore plus, le code après une returninstruction n'est pas exécuté, il n'est donc pas logique de concaténer. Au moins, il }manque un .
Robert
57

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.

Jerry Bullard
la source
9
Je ne suis pas sûr à 100% mais je suis avec toi sur celui-ci, Jerry.
ok
12

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

Donc, tout ce qui arevient sera traité comme une fonction à essayer d'être initialisé.

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.

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

andlrc
la source