0
votes

Pourquoi ma fonction n'appelle-t-elle que fonctionner uniquement lorsque la fonction est une expression et non quand c'est une déclaration de fonction?

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'


0 commentaires

3 Réponses :


0
votes

Il semble que vous soyez mal compris les choses ici. Dans votre exemple: xxx pré>

la fonction "externe", 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>

Donc, en progressant dans le reste de votre code d'origine: P>

const newFunc = printName();

newFunc(); //Prints 'OUTER: steven' 
          //AND 'INNER: steven'


0 commentaires

3
votes
printName()();

2 commentaires

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.



0
votes

printName () fait 2 choses:

1) Il console.log s la valeur de la variable globale myName .

2) IT retour S une fonction nommée printagAIN .

Vous appelez printName () parce que vous souhaitez affecter une valeur à const Newfunc (élément 2 mentionné ci-dessus), mais vous devez vous rendre compte que chaque fois que vous appelez. PrintName () STI CONSOLE.LOG va être appelé (élément 1 mentionné ci-dessus).


0 commentaires