J'ai souvent vu un point-virgule utilisé après une déclaration de fonction ou après la fonction anonyme "return" d'un script Pattern Pattern. Quand est-il approprié d'utiliser un point-virgule après une accolade?
Vous utilisez un point-virgule après une déclaration. Ceci est une déclaration:
var foo = function() {
alert("bar");
};
car c’est une affectation de variable (c’est-à-dire créer et attribuer une fonction anonyme à une variable).
Les deux choses qui me viennent à l’esprit qui ne sont pas des déclarations sont des déclarations de fonctions:
function foo() {
alert("bar");
}
et des blocs:
{
alert("foo");
}
Remarque: cette même construction de bloc sans point-virgule s'applique également aux boucles for
, do
et while
.
C'est également important lorsque vous avez l'intention de réduire votre code.
Donc, personnellement, j'en ajoute un après chaque }
où ASI insère un.
J'ai écrit un post sur ASI en JavaScript .
... s'il ne s'agit que de votre déclaration de fonction quotidienne:
function foo() {
} // No semicolon
... si c'est une mission:
var foo = function() {
}; // Semicolon
... ou une fonction d'invocation automatique:
(function () {
})(); // Semicolon
Vous n'avez jamais besoin de; vous pouvez toujours le faire (sauf avant else
et while
).
Malheureusement, les points-virgules Javascript sont optionnels.
Par conséquent, vous n'avez jamais besoin d'ajouter un point-virgule.
Il est (très) utile de terminer chaque déclaration par un point-virgule.
Les seules instructions qui se terminent par un }
sont des instructions se terminant par un littéral d'objet (par exemple, JSON) ou une expression de fonction.
Par conséquent, la meilleure pratique consiste à mettre des points-virgules après les deux accolades suivantes (uniquement):
var myFunc = function() { };
var myobject = { };
Si nous avons une fonction qui invoque elle-même, nous devons mettre un point-virgule avant, sinon cela fera partie de la déclaration d'affectation précédente. Considérer ce qui suit:
testClass = function(name) {
document.write ("Instantiating testClass<br />");
this.name = name;
}
testClass.prototype.report = function() {
document.write ("I'm " + this.name + "<br />");
return 1;
}
testClass.prototype.testMethod = function(param) {
document.write ("Running testMethod with parameter value " + param + "<br />");
return 2;
} // notice that there is no semicolon here
(function() {
document.write ("Running self-invoking function<br />");
return 3;
}());
if (typeof(testClass.prototype.testMethod) !== "function") {
document.write ("testMethod type: " + typeof(testClass.prototype.testMethod));
document.write (", value: " + testClass.prototype.testMethod + "<br />");
}
var testOb = new testClass("Bill");
testOb.report();
testOb.testMethod(4);
Cela produira la sortie suivante:
"Fonction auto-invoquante
Lancer testMethod avec valeur de paramètre 3
type de testMethod: nombre, valeur: 2
Instanciation testClass
Je suis Bill "
... plus une erreur JavaScript signalée par le navigateur: testOb.testMethod is not a function
Ce n’est certainement pas ce que nous voulions. Pourquoi testMethod
est lancé immédiatement, avant même que nous ayons instancié la classe? Et pourquoi n’existe-t-il plus lorsque nous voulons l’appeler en tant que méthode membre?
Il se produit que testMethod
n'est pas affecté à notre définition de fonction, mais à la valeur de retour de la définition de fonction. Et la définition de fonction elle-même est exécutée anonymement. C'est ainsi:
testClass
et la méthode membre report
sont définis/affectés avec succès.testMethod
, le ()
entourant la fonction d'auto-invocation suivante devient un opérateur d'invocation, ce qui fait que ce que nous pensons être notre définition de testMethod
devient une fonction anonyme invoquée immédiatement et la valeur de retour de la fonction anonyme suivante devient sa liste de paramètres. Ceci explique l’ordre de la sortie imprimée - notre fonction d’invocation automatique est exécutée d’abord car elle est évaluée en tant que paramètre.testMethod
et not à la définition de la fonction. Ceci est confirmé par notre impression du type et de la valeur de testMethod
.testClass
est instancié avec succès avec testOb
et sa méthode report
fonctionne comme prévu, ce qui prouve que la définition de la classe est par ailleurs intacte.testMethod
, l'interprète nous dit que ce n'est pas une fonction - et à juste titre, car c'est un nombre avec la valeur 2.Si nous plaçons un point-virgule après la définition de testMethod
, cela séparera son affectation de l'appel de la fonction auto-appelante et nous obtiendrons le résultat que nous attendions:
"Fonction auto-invoquante
Instanciation testClass
Je suis Bill
Exécution de testMethod avec la valeur de paramètre 4 "
Ou nous pourrions même le mettre directement avant la fonction anonyme:
;(function() {...
Mais je suggère que, puisque le problème est dû à l’absence de point-virgule à la fin d’un énoncé d’affectation, nous devrions peut-être prendre l’habitude de toujours mettre un point-virgule après avoir défini les fonctions de cette manière. c'est-à-dire que toutes mes fonctions ci-dessus devraient avoir un point-virgule après l'accolade fermante, car ce sont toutes des assignations de fonctions anonymes.
Vous devez également utiliser un point-virgule après une accolade après le retour d'une fonction dans une fonction en Javascript.
function watchOut(problem) {
return function(number, location) {
alert("Be careful! There are " + problem +
" today!\n" +
number + " have been spotted at the " + location + "!"
);
};
}
Je sais que ce fil est vieux mais je n'ai pas pu résister à partager ce code:
// this will break code
a=b=c=d=e=1
a = b + c //semicolon required here
(d + e).toString()
Retourne "La propriété de l'objet [objet Objet] n'est pas une fonction". Parce qu'il sera réellement exécuté comme:
a = b + c(d + e).toString()
Les points-virgules vont à la fin des lignes qui ne se terminent pas par une accolade ou des instructions séparées sur la même ligne. Il ne fait aucun mal de les utiliser après une fermeture, ou de porter des bretelles et une ceinture, mais ça a l'air un peu ringard.