Cela m'intéresse s'il existe des limites quant aux types de valeurs pouvant être définis à l'aide de const
en JavaScript - dans des fonctions particulières. Est-ce valide? Certes, cela fonctionne, mais est-ce considéré comme une mauvaise pratique pour une raison quelconque?
const doSomething = () => {
...
}
Toutes les fonctions doivent-elles être définies de cette manière dans ES6? Il ne semble pas que cela a pris, si c'est le cas.
Merci pour vos commentaires!
Ce que vous avez fait ne pose aucun problème, mais vous devez vous rappeler la différence entre les déclarations de fonction et les expressions de fonction.
Une déclaration de fonction, c'est-à-dire:
function doSomething () {}
Est entièrement hissé au sommet de la portée (et, comme let
et const
, ils sont également dotés d’une portée de bloc).
Cela signifie que ce qui suit fonctionnera:
doSomething() // works!
function doSomething() {}
Une expression de fonction, c'est-à-dire:
[const | let | var] = function () {} (or () =>
Est la création d’une fonction anonyme (function () {}
) et la création d’une variable, puis l’affectation de cette fonction anonyme à cette variable.
Par conséquent, les règles habituelles relatives au levage de variables dans une portée - les variables à portée de bloc (let
et const
) ne remontent pas comme undefined
en haut de leur portée de bloc.
Ça signifie:
if (true) {
doSomething() // will fail
const doSomething = function () {}
}
Echouera puisque doSomething
n'est pas défini. (Il va lancer un ReferenceError
)
Si vous passez à l'aide de var
, vous obtenez le levage de la variable, mais celle-ci sera initialisée à undefined
de sorte que le bloc de code ci-dessus ne fonctionnera toujours pas. (Cela jettera un TypeError
puisque doSomething
n'est pas une fonction au moment où vous l'appelez)
En ce qui concerne les pratiques standard, vous devez toujours utiliser le bon outil pour le travail.
Axel Rauschmayer a une excellente contribution sur la portée et le levage, y compris la sémantique es6: Variables et portée dans ES6
Bien que l'utilisation de const
pour définir des fonctions semble être un hack, elle présente toutefois de grands avantages qui la rendent supérieure (à mon avis)
Cela rend la fonction immuable, vous évitant ainsi que cette fonction soit modifiée par un autre élément de code.
Vous pouvez utiliser la syntaxe des grosses flèches, qui est plus courte et plus nette.
L'utilisation des fonctions de flèche prend en charge la liaison this
pour vous.
exemple avec function
// define a function
function add(x, y) { return x + y; }
// use it
console.log(add(1, 2)); // 3
// oops, someone mutated your function
add = function (x, y) { return x - y; };
// now this is not what you expected
console.log(add(1, 2)); // -1
même exemple avec const
// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;
// use it
console.log(add(1, 2)); // 3
// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged
Cela fait trois ans que cette question a été posée, mais je suis en train de la comprendre. Puisque cette réponse est si loin dans la pile, permettez-moi de la répéter:
Q: Cela m'intéresse s'il existe des limites quant aux types de valeurs pouvant être définies à l'aide de const en JavaScript - dans des fonctions particulières. Est-ce valide? Certes, cela fonctionne, mais est-il considéré comme une mauvaise pratique pour quelque raison que ce soit?
J'étais motivé pour faire des recherches après avoir observé un codeur JavaScript prolifique qui utilisait toujours en utilisant l'instruction const
pour functions
, même en l'absence de raison/avantage apparent .
En réponse à " est-ce considéré comme une mauvaise pratique pour quelque raison que ce soit? ", laissez-moi vous dire, IMO, oui, ou du moins, il y a des avantages pour utiliser l'instruction function
.
Il me semble que c'est en grande partie une question de préférence et de style. Quelques bons arguments ont été présentés ci-dessus, mais aucun n’est aussi clair que dans cet article:
Confusion constante: pourquoi j'utilise toujours les instructions de fonction JavaScript par medium.freecodecamp.org/Bill Sourour, Gourou JavaScript, consultant et enseignant.
J'exhorte tout le monde à lire cet article, même si vous avez déjà pris une décision.
Voici les points principaux:
Les instructions de fonction présentent deux avantages évidents par rapport aux expressions de fonction [const]:
Avantage n ° 1: Clarté de l'intention
Lorsque vous parcourez des milliers de lignes de code par jour, il est utile de pouvoir comprendre l’intention du programmeur aussi rapidement et facilement que possible.Avantage n ° 2: Ordre de déclaration == ordre d'exécution
Idéalement, je souhaite déclarer mon code plus ou moins dans l'ordre dans lequel il devrait être exécuté.
C’est pour moi l’essentiel: toute valeur déclarée à l’aide du mot-clé const est inaccessible jusqu’à ce que l’exécution lui parvienne.
Ce que je viens de décrire ci-dessus nous oblige à écrire un code qui a l’air renversé. Nous devons commencer par la fonction de niveau le plus bas et progresser vers le haut.
Mon cerveau ne fonctionne pas comme ça. Je veux le contexte avant les détails.
La plupart du code est écrit par des humains. Il est donc logique que l’ordre de compréhension de la plupart des gens suit à peu près celui de la plupart des codes.
L'utilisation de const
présente des avantages très importants et certains diraient qu'elle devrait être utilisée chaque fois que possible, en raison de la mesure dans laquelle elle est délibérée et indicative.
Autant que je sache, c’est la déclaration de variables en JavaScript la plus indicative et la plus prévisible, et l’une des plus utiles, PARCE QU’ELLE est contrainte. Pourquoi? Parce qu’il élimine certaines possibilités offertes par les déclarations var
et let
.
Que pouvez-vous déduire quand vous lisez un const
? Vous savez tout ce qui suit simplement en lisant l'instruction de déclaration const
, ET sans rechercher d'autres références à cette variable:
La citation suivante est tirée de n article concernant les avantages de let
et const
. Il répond également plus directement à votre question sur les contraintes/limites du mot clé:
Des contraintes telles que celles proposées par
let
etconst
constituent un moyen puissant de rendre le code plus facile à comprendre. Essayez d'accumuler autant de contraintes que possible dans le code que vous écrivez. Plus les contraintes déclaratives limitant la signification d'un morceau de code sont nombreuses, plus il est facile et rapide pour les humains de lire, analyser et comprendre un morceau de code dans le futur.Certes, il y a plus de règles dans une déclaration
const
que dans une déclarationvar
: block-scoped, TDZ, attribuer lors de la déclaration, aucune réaffectation. Tandis quevar
les instructions ne signalent que la portée de la fonction. Compter les règles, cependant, n’offre pas beaucoup de perspicacité. Il est préférable de pondérer ces règles en termes de complexité: la règle ajoute-t-elle ou soustrait-elle la complexité? Dans le cas deconst
, la portée des blocs signifie une portée plus étroite que celle des fonctions, TDZ signifie qu'il n'est pas nécessaire d'analyser la portée à partir de la déclaration pour repérer l'utilisation avant la déclaration, et les règles d'attribution signifient que la liaison conservera toujours la même référence.Plus les instructions sont limitées, plus un élément de code devient simple. Au fur et à mesure que nous ajoutons des contraintes à la signification d'une instruction, le code devient moins imprévisible. C'est l'une des principales raisons pour lesquelles les programmes à typage statique sont généralement plus faciles à lire que ceux à typage dynamique. Le typage statique impose une contrainte importante au rédacteur du programme, mais également à la manière dont le programme peut être interprété, ce qui rend son code plus facile à comprendre.
Gardant ces arguments à l’esprit, il est recommandé d’utiliser
const
dans la mesure du possible, car c’est l’affirmation qui nous donne le moins de possibilités de réflexion.