À quoi sert le point-virgule principal des bibliothèques JavaScript?


156

Dans plusieurs bibliothèques JavaScript, j'ai vu cette notation au tout début:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

Bien que je sois parfaitement à l'aise avec la syntaxe "fonction immédiatement exécutée"

(function(){...})()

Je me demandais à quoi sert le point-virgule. Tout ce que je pourrais trouver, c'est que c'est une assurance. C'est-à-dire que si la bibliothèque est incorporée dans un autre code bogué, elle sert de type de ralentisseur "la dernière instruction se termine ici au plus tard".

At-il une autre fonctionnalité?


Réponses:


140

Il vous permet de concaténer en toute sécurité plusieurs fichiers JavaScript en un seul, pour le servir plus rapidement en une seule requête HTTP.


16
Mais ce ne serait pas nécessaire, si tous les fichiers étaient codés correctement, n'est-ce pas?
Boldewyn

8
Non: dans votre exemple, vous obtiendrez (function(){...})()(function(){...})().
Aaron Digulla

8
Ce que je voulais dire par `` codé correctement '', que chaque bibliothèque se termine par la quantité correcte de points-virgules de fin ...
Boldewyn

6
Ouais Boldewyn, mais ce n'est tout simplement pas le cas.
Mathias Bynens

13
Deux fichiers mal codés ne seront pas adaptés simplement du fait qu'un troisième fichier contient ce correctif sale. Pourquoi le concaténateur ne peut-il pas ajouter des points-virgules supplémentaires entre les fichiers dans le résultat?
Dávid Horváth

30

La meilleure réponse a en fait été donnée dans la question, je vais donc l'écrire ici pour plus de clarté:

Le début ;devant les expressions de fonction immédiatement appelées est là pour éviter les erreurs lors de l'ajout du fichier pendant la concaténation à un fichier contenant une expression qui ne se termine pas correctement par un ;.

La meilleure pratique consiste à terminer vos expressions par des points-virgules, mais également à utiliser le point-virgule de début comme protection.


Pourquoi aussi terminer vos expressions par des points-virgules, si vous utilisez des points-virgules défensifs? Soit vous prenez le risque de vous fier à des points-virgules à la fin de chaque ligne, soit vous utilisez des points-virgules défensifs. Faire les deux fait que les gens concluent à tort qu'il y a une raison de faire les deux. Le conseil d'utiliser des points-virgules défensifs est bon; le conseil de remplacer également chaque instance de "\n"par ";\n"n'a aucun sens.
Vladimir Kornea le

4
@VladimirKornea: parce que vous n'utilisez pas toujours uniquement vos propres bibliothèques :)
jvenema

@jvenema Je ne sais pas pourquoi vous pensez que cela fait une différence.
Vladimir Kornea

6
Parce que vous ne pouvez pas vous fier au code de quelqu'un d'autre selon vos conventions. Codez de manière défensive et vous n'avez pas à le faire.
jvenema

1
@VladimirKornea Vous pouvez également considérer cela comme défensif, si vous le souhaitez - cela se défend contre le code de quelqu'un d'autre qui ne commence pas toujours par des points-virgules défensifs.
Nathan Hinchey

26

En général, si une instruction commence par (, [, /, + ou -, il est possible qu'elle soit interprétée comme une continuation de l'instruction précédente. Les instructions commençant par /, + et - sont assez rares dans la pratique , mais les instructions commençant par (et [ne sont pas rares du tout, du moins dans certains styles de programmation JavaScript. Certains programmeurs aiment mettre un point-virgule défensif au début d'une telle instruction afin qu'elle continue à fonctionner correctement même si l'instruction avant qu'il ne soit modifié et un point-virgule de fin précédemment supprimé:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

La source:

JavaScript: The Definitive Guide, 6e édition


9

C'est ce qu'on appelle un point-virgule principal.

Son objectif principal est de se protéger du code précédent qui n'a pas été correctement fermé, ce qui peut causer des problèmes. Un point-virgule empêchera que cela se produise. Si le code précédent n'a pas été correctement fermé, notre point-virgule corrigera cela. S'il a été correctement fermé, notre point-virgule sera inoffensif et il n'y aura pas d'effets secondaires.


7

Une réponse en une ligne consiste à concaténer en toute sécurité plusieurs fichiers JavaScript. L'utilisation d'un point-virgule ne pose pas de problème.

Supposons que vous ayez plusieurs fonctions:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

Lors de la concaténation, cela peut ressembler à:

(function(){})()(function(){})()

Mais si vous ajoutez un point-virgule avant la fonction, cela ressemblera à:

;(function(){})();(function(){})()

Donc en ajoutant un ; , il prend soin si une expression n'est pas correctement terminée.

Exemple 2

Supposons que vous ayez un fichier JavaScript avec une variable:

var someVar = "myVar"

Un autre fichier JavaScript avec une fonction:

(function(){})()

Maintenant, lors de la concaténation, cela ressemblera à

var someVar = "myVar"(function(){})() // It may give rise to an error

Avec un point-virgule, cela ressemblera à:

var someVar = "myVar";(function(){})()

4

C'est bien lorsque vous réduisez le code JavaScript. Il évite les erreurs de syntaxe inattendues.


Comme ça? Le point-virgule a-t-il une signification pour le code suivant ou s'agit-il simplement d'un code bogué hypothétique fusionné devant la bibliothèque réelle?
Boldewyn

Dans, ce code seul, aucune signification particulière, mais lorsque ce code est au milieu d'autres codes et que vous le réduisez à une seule ligne, il peut y avoir des erreurs inattendues, comme (1) point-virgule manquant dans les lignes précédentes, (1 ) le précédent est également des fonctions, donc ce sera () () () (), quand get error, difficile à déboguer, nous ne pouvons pas le dire bogué, car avant de minimiser son fonctionnement.
VOUS

1
Mais c'est sûrement la responsabilité du mineur de gérer cela correctement. Les minificateurs de buggy sont-ils la norme de nos jours?
Vladimir Kornea
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.