Pourquoi devrais-je utiliser un point-virgule après chaque fonction en javascript?

282

J'ai vu différents développeurs inclure des points-virgules après les fonctions en javascript et d'autres non. Quelle est la meilleure pratique?

function weLikeSemiColons(arg) {
   // bunch of code
};

ou

function unnecessary(arg) {
  // bunch of code
}
macca1
la source

Réponses:

424

Les points-virgules après les déclarations de fonction ne sont pas nécessaires .

La grammaire de a FunctionDeclarationest décrite dans la spécification comme suit:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Il n'y a pas de point-virgule grammaticalement requis, mais vous demandez-vous pourquoi?

Les points-virgules servent à séparer les déclarations les unes des autres, et a FunctionDeclarationn'est pas une déclaration .

FunctionDeclarationssont évalués avant que le code ne soit exécuté, le hissage est un mot courant utilisé pour expliquer ce comportement.

Les termes "déclaration de fonction" et "instruction de fonction" sont souvent utilisés à tort de manière interchangeable, car il n'y a pas d'énoncé de fonction décrit dans la spécification ECMAScript, mais certaines implémentations incluent une déclaration de fonction dans leur grammaire, notamment Mozilla, mais encore une fois cette est non standard.

Cependant, les points-virgules sont toujours recommandés là où vous utilisez FunctionExpressions, par exemple:

var myFn = function () {
  //...
};

(function () {
  //...
})();

Si vous omettez le point-virgule après la première fonction dans l'exemple ci-dessus, vous obtiendrez des résultats complètement indésirables:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

La première fonction sera exécutée immédiatement, car les parenthèses entourant la seconde seront interprétées comme celles Argumentsd'un appel de fonction.

Conférences recommandées:

CMS
la source
2
Modifié pour clarifier, cet article parle d' expressions de fonction
CMS
1
Pas tout à fait familier avec l'ECMA, mais c'est aussi la norme que j'utilise. Bon post. La plupart des tuts que je vois en ligne et des exemples de code que j'utilise DL utilisent ce standard, donc je viens de m'y adapter.
regex
1
Une partie de la confusion ici peut être influencée par l'absence d'un bon mot anglais pour «permise car elle sera ignorée». Nous nous rabattons sur le fait de dire "facultatif", mais c'est trompeur car cela suggère que ne pas inclure de point-virgule après une déclaration tombe dans la même catégorie que de ne pas inclure de point-virgule après une déclaration. Ce dernier est facultatif dans un sens entièrement différent: c'est parce que l'analyseur ajoutera le point-virgule manquant que vous avez omis , alors que dans ce cas, c'est parce que l'analyseur ignorera le point-virgule que vous avez inclus . Autrement dit: si l'un est facultatif, il en est de même pour huit .
Point
Le lien "Expressions de fonction nommées démystifiées" renvoie à une URL morte maintenant, l'archive Web en a une copie ici: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
Tony
Le dernier exemple est excellent. L'omission d'un point-virgule dans ce cas conduit à des bogues extrêmement étranges et difficiles à déboguer. Votez sans réserve.
Yan Yankowski
38

Je les utilise après des déclarations de fonction en tant que variable:

var f = function() { ... };

mais pas après les définitions de style classique:

function f() {
    ...
}
Gabe Moothart
la source
NetBeans, ainsi que d'autres IDE aiment voir le point-virgule après une fonction en tant que variable telle que this.animaton_fun = function () {...};
Lance Cleveland
6
Mais - pour le questionneur - pourquoi ?
Luke
cela aide pendant l'étape de construction. Lorsqu'un script uglifier voit un point-virgule, il n'a pas besoin d'ajouter un saut de ligne au fichier de sortie, sinon, un saut de ligne sera généré et le fichier sera légèrement plus volumineux.
Autoboxer
20

JS Lint est une convention de facto et ne dit pas de point-virgule après le corps de la fonction. Voir la section "Point-virgule" .

David Hedlund
la source
10
J'ai été témoin d'une fonction qui a échoué en raison d'un manque de point-virgule. Je ne suis absolument pas d'accord pour dire que le laisser est une convention. Bien que 99,99% du temps, il ne se casse pas, il y a certaines situations où j'ai remarqué qu'IE n'a pas pu interpréter JavaScript sans le point-virgule.
MillsJROSS
8
Ma réponse ne traite que des définitions de fonctions comme dans les deux exemples de la question. Dans ces cas, un point-virgule de fin n'est pas nécessaire dans aucun navigateur, dans aucune situation. Je suppose que vous pensez peut-être aux expressions de fonction. C'est une question complètement différente, et pas une qui a été abordée dans la question initiale.
David Hedlund
var myFunction = function (arg) {console.log (arg); } (function () {console.log ('fonction complètement indépendante)); retourne' voir ce qui se passe ';} ());
Maciej Krawczyk
@MillsJROSS J'appuie la réponse de David et serais heureux si vous expliquiez l'échec que vous avez rencontré. Était-ce bien une expression de fonction ou un bug d'IE?
wlnirvana
7

Restez juste cohérent! Ils ne sont pas nécessaires, mais je les utilise personnellement car la plupart des techniques de minification reposent sur le point-virgule (par exemple, Packer ).

Josh Stodola
la source
5

Cela dépend vraiment de vos préférences. J'aime terminer les lignes de code avec des points-virgules parce que je suis habitué à Java, C ++, C #, etc., donc j'utilise les mêmes normes pour le codage en javascript.

Je ne termine généralement pas les déclarations de fonction en point-virgule, mais c'est juste ma préférence.

Les navigateurs l'exécuteront de toute façon, mais peut-être un jour ils proposeront des normes plus strictes régissant cela.

Exemple de code que j'écrirais:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}
regex
la source
1
les lignes doivent certainement se terminer par des points-virgules, mais. sinon un minifieur pourrait casser complètement la fonctionnalité
David Hedlund
9
@david: dans ce cas le minifieur est cassé, sûrement?
DisgruntledGoat
D'accord. C'est un moyen naturel de codage pour les personnes (comme moi) issues de milieux C / C ++. Cela rend également le code plus lisible.
Anshuman Manral
3

C'est en fait plus qu'une question de convention ou de cohérence.

Je suis assez certain que non placer de point-virgule après chaque instruction ralentit l'analyseur interne car il doit déterminer où se trouve la fin de l'instruction. J'aurais aimé avoir quelques chiffres à portée de main pour que vous le confirmiez positivement, mais vous pouvez peut-être le rechercher vous-même sur Google. :)

De plus, lorsque vous compressez ou réduisez du code, un manque de points-virgules peut conduire à une version réduite de votre script qui ne fait pas ce que vous vouliez car tout l'espace blanc disparaît.

le maçon
la source
3
La question était de savoir si les points-virgules devaient être après les fonctions, pas toutes les instructions. Je suis d'accord que vous devriez placer des points-virgules après chaque déclaration, et j'ai vu d'autres consensus stackoverflow dire la même chose.
macca1
1
D'accord, et le fait de ne pas mettre de point-virgule après les fonctions entraînera le problème de minification que j'ai mentionné. Bonne chance monsieur.
Mason
Le vote positif parce que le renforcement du problème de minification a clarifié ma compréhension
JackW327
1

Quand j'ai minifié mes scripts, j'ai réalisé que je devais utiliser un point-virgule pour les fonctions qui commencent par une marque égale. si vous définissez une fonction comme var, oui, vous devez utiliser un point-virgule.

besoin d'un point-virgule

var x = function(){};
var x = new function(){};
this.x = function(){};

pas besoin de point-virgule

function x(){}
senera
la source
0

FACILE:

Il est recommandé de laisser les points-virgules ;après la fin des accolades de fonction. Ils sont considérés comme une meilleure pratique depuis des années.

Un avantage de toujours les utiliser est que vous souhaitez réduire votre JavaScript.

En minimisant le Javascript, aide à réduire un peu la taille du fichier.

Mais comme pour la meilleure pratique et la réponse ci-dessus, il n'est pas recommandé de l'utiliser après une balise de fonction.

Si vous N'utilisez PAS de points-virgules, et si vous souhaitez réduire (comme beaucoup de développeurs aiment le faire si leur site utilise beaucoup de JavaScript), vous pouvez obtenir toutes sortes d'erreurs / avertissements.

Shaze
la source
0

le point-virgule après une fonction n'est pas nécessaire de l'utiliser ou non, ne provoque pas d'erreurs dans votre programme. cependant, si vous prévoyez de réduire votre code, l'utilisation de points-virgules après les fonctions est une bonne idée. par exemple, vous avez un code comme celui ci-dessous

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

et

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

lorsque vous réduisez les deux, vous obtiendrez ce qui suit en sortie

Notez que les commentaires sont juste pour l'illustration

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

et

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
DilanTsasi
la source