Apprendre sur les fermetures, j'ai écrit une fonction qui renvoie une fonction qui imprime un nom à la console:
p>
let myName = 'steven'; function printName() { console.log(`OUTER: ${myName}`); return function printAgain() { console.log(`INNER: ${myName}`); }; } printName(); //Only prints 'OUTER: steven' const newFunc = printName(); newFunc(); //Prints 'OUTER: steven' //AND 'INNER: steven'
3 Réponses :
Il semble que vous soyez mal compris les choses ici. Dans votre exemple: la fonction "externe", Donc, en progressant dans le reste de votre code d'origine: P> printName code>, enregistre la chaîne
"externe" code> chaque fois qu'il est exécuté. Cette exécution arrive également à renvoyer une nouvelle fonction, le "intérieur". Ceci enregistre la chaîne
"interne" code> lorsqu'il est exécuté. P>
const newFunc = printName();
newFunc(); //Prints 'OUTER: steven'
//AND 'INNER: steven'
printName()();
Merci beaucoup! Y a-t-il un terme pour que lorsque vous utilisez deux ensembles de parenthèses à la fin d'une fonction comme PrintName () () dans l'exemple ci-dessus? Est-ce juste une mauvaise pratique de le faire de cette façon?
La pratique d'une fonction qui renvoie une fonction s'appelle une "fonction d'ordre supérieur". Je ne sais pas d'un terme pour quand vous les appelez tous les deux à l'arrière. Ce n'est pas automatiquement une mauvaise pratique, cela dépend simplement de votre objectif. Souvent, l'utilité d'une fonction d'ordre supérieur est que vous pouvez créer la fonction interne, puis la réutiliser plusieurs fois. Cela ne peut fonctionner que si vous l'attribuez à une variable. Si vous n'avez pas besoin de cela, alors il n'y a pas besoin de le faire.
1) Il 2) IT Vous appelez printName () code> fait 2 choses: p>
console.log code> s la valeur de la variable globale
myName code>. p>
retour code> S une fonction nommée
printagAIN code>. P>
printName () code> parce que vous souhaitez affecter une valeur à
const Newfunc code> (élément 2 mentionné ci-dessus), mais vous devez vous rendre compte que chaque fois que vous appelez.
PrintName () CODE> STI
CONSOLE.LOG CODE> va être appelé (élément 1 mentionné ci-dessus). p>