Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forums MacBidouille _ Les Langages Du Web _ JavaScript ES6 * Closure et conservation de valeur de paramètre [Résolu]

Écrit par : scoch 19 Apr 2020, 12:51

Bonjour,

j’essaie, sans succès, d’adapter avec des fonctions fléchées d’ES6 ce code qui permet de conserver une valeur de paramètre en référençant une fonction qui contient une fermeture (closure) :

Exemple qui fonctionne sans fonctions fléchées :

Code
function externe(x) {
   function interne(y) {
      return x + y;
   }
   return interne;
}

let resultat = externe(1)(3);
console.log(resultat); // affiche 4

// référencer la fonction externe avec une valeur en paramètre
// cette valeur est conservée
const fonctionInterne = externe(3);

// appel de la fonction externe avec passage de paramètre
// pour la fonction interne
resultat = fonctionInterne(5);
console.log(resultat); // affiche 8 (3 + 5)
resultat = fonctionInterne(4);
console.log(resultat); // affiche 7 (3 + 4)


Exemple qui ne fonctionne pas avec des fonctions fléchées :
Code
const externe = (x) => {
   const interne = (y) => {
      x + y;
   }
   interne;
}

const fonctionInterne = externe(3);

let resultat = fonctionInterne(5);
console.log(resultat); // TypeError: fonctionInterne is not a function


Edit : j’ai solutionné le problème qui semble venir du fait que, dans ce cas, le retour implicite de valeur ne fonctionne pas. J’ai donc utilisé explicitement return.

La solution :
Code
const externe = (x) => {
   const interne = (y) => {
      return x + y;
   }
   return interne;
}


Si vous avez une idée explication, je suis preneur !
Merci.

Ré édit : titre conforme à la charte smile.gif

Écrit par : Jaypee 22 Apr 2020, 12:46

On peut ne pas nommer la fonction interne, mais effectivement les deux "return" sont obligatoires, et je n'ai rien lu qui l'explique :

Code
const externe = (x) => { return (y) => { return x + y } }

JP
PS : j'ai lu ceci : Pas de return implicite si les accolades sont utilisées. Donc soit on a { return expression }, soit on a expression seule...
La forme concise ultime est alors :
Code
const externe = (x) => (y) => x + y

Écrit par : scoch 22 Apr 2020, 13:23

Citation (Jaypee @ 22 Apr 2020, 13:46) *
Pas de return implicite si les accolades sont utilisées.

Exact ! Merci.

Écrit par : scoch 22 Apr 2020, 19:53

Citation (Jaypee @ 22 Apr 2020, 13:46) *
La forme concise ultime est alors :
Code
const externe = (x) => (y) => x + y

En cas de paramètre unique les parenthèses ne sont pas nécessaires. La forme concise ultime est donc wink.gif
Code
const externe = x => y => x + y

Écrit par : Jaypee 22 Apr 2020, 21:49

Magnifique !

JP

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)