web-dev-qa-db-fra.com

Utilisation appropriée de const pour définir des fonctions en JavaScript

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!

135
David Sinclair

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

189
tkone

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)

  1. Cela rend la fonction immuable, vous évitant ainsi que cette fonction soit modifiée par un autre élément de code.

  2. Vous pouvez utiliser la syntaxe des grosses flèches, qui est plus courte et plus nette.

  3. 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
71
Gaafar

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.

15
JMichaelTX

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 valeur est liée à cette variable (bien que l'objet sous-jacent ne soit pas profondément immuable)
  • on ne peut pas y accéder en dehors de son bloc contenant immédiatement
  • la liaison n'est jamais consultée avant la déclaration, en raison des règles de la zone morte temporelle (TDZ).

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 et const 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éclaration var: block-scoped, TDZ, attribuer lors de la déclaration, aucune réaffectation. Tandis que var 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 de const, 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.

Source: https://ponyfoo.com/articles/var-let-const

6
mrmaclean89