109 votes

Point-virgule avant la fonction d'auto-invocation ?

Quel est l'avantage d'utiliser le point-virgule avant une fonction auto-invoquée en JavaScript ? J'ai vu cette approche dans quelques plugins jQuery populaires et je suis curieux de savoir si c'est la prochaine chose géniale en JavaScript que je ne connais pas.

2 votes

Le point-virgule est placé devant la parenthèse gauche. ( afin d'éviter que l'interprète JavaScript n'interprète les parenthèses comme un opérateur d'invocation de fonction.

1 votes

2 votes

L'article de Smashing Magazine l'utilise pour le plugin jquery boilterplate : coding.smashingmagazine.com/2011/10/11/

175voto

amoebe Points 1192

Si vous concaténer deux fichiers avec des fonctions auto-invoquantes ensemble qui ressemblent à ceci :

Dossier A :

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

Fichier B :

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

Dossier A+B :

(function(){...A...})()(function(){...B...})()

Vous avez deux déclarations sans séparateur. Cela se produit lorsque vous regroupez des fichiers et les réduisez ensuite.

Maintenant, l'auteur du fichier B met un point-virgule devant :

Dossier B2 :

;(function(){...B2...})()

Et vous obtiendrez un script fonctionnel :

(function(){...A...})();(function(){...B2...})()

19 votes

Eh bien, pourquoi devrais-je préférer le point-virgule devant la fonction d'auto-invocation plutôt qu'après ?

36 votes

@7elephant 2 points-virgules ne font pas de mal, mais aucun point-virgule n'en fait, c'est donc une question de sécurité, particulièrement pertinente pour les grands projets.

15 votes

Médecine préventive

31voto

Mike Samuel Points 54712

Les fonctions qui s'invoquent elles-mêmes sont entourées de parenthèses et, en JavaScript, les parenthèses sont surchargées de manière à signifier

  1. Regroupement d'expressions pour passer outre la préséance : (x + y) * z
  2. Application de la fonction : f()

Le fait de placer un point-virgule avant la fonction permet d'éviter que la fonction ne devienne un argument de ce qui la précède lorsque les parenthèses se confondent avec l'application de la fonction.

Pensez à

var x = 42

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

est la même chose que

var x = 42(function () { ... })()

mais

var x = 42

;

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

est la même chose que

var x = 42;

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

2 votes

C'est seulement quand il est mal minifié

0 votes

@Neal, pouvez-vous expliquer. Je pense que la minification est tout à fait orthogonale à cela.

2 votes

@Neal C'est équivalent autrement aussi : essayez de remplacer ... con return 1 puis ajoutez le point-virgule après 42 et voyez la différence.

15voto

I écrire tous JavaScript dans un style sans point-virgule. Lorsque l'on écrit sans point-virgule à la fin de chaque ligne, en raison de l'insertion automatique du point-virgule (ASI), il existe quelques cas particuliers qui peuvent être "déroutants" au début :

  1. Commencer une expression de haut niveau avec un opérateur , a ( (parenthèse ouverte) dans ce cas, qui comme la plupart des autres opérateurs , peut continuer l'expression précédente et supprime ainsi "l'insertion automatique d'un point-virgule". (En général, cela ne se produit que lors de l'utilisation d'une fonction auto-invoquante).

  2. Je plaisante pour le numéro 2 : il n'y en a pas ! (Apprenez une seule règle et vous pourrez vous aussi profiter de la vie sans points-virgules supplémentaires ;-)

Puisque j'écris dans un style sans point-virgule, j'ai donc toujours l'écrire comme (où l'expression de la fonction peut naturellement s'étendre sur plusieurs lignes) :

;(FunctionExpression)()

Sur mon Il ne s'agit pas d'une question de "sécurité" ou d'essayer de "repérer une erreur" (honnêtement, si votre style consiste à utiliser des points-virgules et que vous oubliez un point-virgule, alors vous avez fait une erreur). a déjà créé l'erreur ailleurs et la rédaction d'un ; au départ pour la "sécurité" est une foutaise). Non, dans mon cas, c'est pour cohérence con connaissance de mon style choisi et de "savoir" que commencer une ligne avec un opérateur peut poursuivre une expression à partir d'une ligne précédente.

Voir JavaScript : Insertion du point-virgule (Tout ce que vous devez savoir) pour les détails (c'est de loin le meilleur article que j'ai vu sur le sujet).

Bon codage.

3voto

Francis Points 81

Pour moi, le point-virgule déclenchait une erreur dans Internet Explorer 8 (ou du moins c'est ce que disait IETester), et empêchait les onglets de l'interface utilisateur de fonctionner correctement.

Le message d'erreur était Invalid character in jquery.all.ui.js Line: 1. Char: 1 .

Je suis tombé sur le point-virgule complètement par hasard. Lorsque j'ai supprimé le ; de la ;(function($) ça a marché, apparemment sans effets secondaires ni perte de fonctionnalité. J'utilise Drupal, je ne sais pas si cela a quelque chose à voir avec le problème.

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