Fonctions de retour d'une fonction
Je suis coincé avec cette notion de "Fonctions qui retournent des fonctions'. Je fais référence au livre " Orienté Objet, Javascript, par Stoyan Stefanov.
Extrait De:
JS:
function a() {
alert('A!');
function b(){
alert('B!');
}
return b();
}
var s = a();
alert('break');
s();
De sortie:
A!
B!
break
Extrait De Deux
JS:
function a() {
alert('A!');
function b(){
alert('B!');
}
return b;
}
var s = a();
alert('break');
s();
De sortie:
A!
break
B!
Quelqu'un peut-il me dire la différence entre le retour b
et b()
ci-dessus des extraits?
- Vous découvrirez le premier extrait donne une erreur sur s();
Vous devez vous connecter pour publier un commentaire.
L'affectation d'une variable à une fonction (sans les parenthèses) des copies de la référence à la fonction. Mettre les parenthèses à la fin d'un nom de fonction, les appels de la fonction, le retour des fonctions de valeur de retour.
Démo
Dans votre exemple, vous êtes également de définir des fonctions à l'intérieur d'une fonction. Tels que:
La fonction est toujours exigible. Il existe encore. Il est utilisé en JavaScript tout le temps. Les fonctions peuvent être passés juste comme les autres valeurs. Considérez les points suivants:
La fonction count pouvez garder les variables qui ont été définies en dehors d'elle. Cela s'appelle une fermeture. Il est aussi beaucoup utilisé en JavaScript.
this
signifie seulement quelque chose à l'intérieur d'un corps de la fonction, sinon il est global. Ce que vous dites pourthis.sayName
est que vous voulez la variable globalesayName
qui n'existe pas, il n'est pas, n'est donc pas exigible.De retourner le nom de la fonction sans
()
renvoie une référence à la fonction, qui peuvent être affectés comme vous l'avez fait avecvar s = a()
.s
contient maintenant une référence à la fonctionb()
, et en appelants()
est fonctionnellement équivalent à l'appel deb()
.L'appel de la fonction avec
()
dans une instruction de retour exécute la fonction, et retourne la valeur renvoyée par la fonction. Il est similaire à l'appelvar x = b();
, mais au lieu d'affecter la valeur de retour deb()
vous êtes de retour à partir de la fonction d'appela()
. Si la fonctionb()
lui-même ne retourne pas de valeur, l'appel renvoieundefined
après ce que d'autres travaux sont effectués par lab()
.return b();
appelle la fonction b(), et retourne son résultat.return b;
renvoie une référence à la fonction de b, que vous pouvez stocker dans une variable pour l'appeler plus tard.Retour
b
est de retourner un objet de fonction. En Javascript, les fonctions sont juste des objets, comme tout autre objet. Si vous trouvez que pas utile, il suffit de remplacer le mot "objet" avec la "chose". Vous pouvez retourner n'importe quel objet à partir d'une fonction. Vous pouvez retourner une valeur true/false. Un entier (1,2,3,4...). Vous pouvez retourner une chaîne de caractères. Vous pouvez retourner un objet complexe avec de multiples propriétés. Et vous pouvez revenir à une fonction. une fonction est une chose.Dans votre cas, le retour
b
retourne la chose, la chose est une fonction appelable. De retourb()
renvoie la valeur retournée par la fonction appelable.Considérer ce code:
À l'aide de la définition ci-dessus,
return b();
renvoie la valeur 42. D'autre partreturn b;
retourne une fonction, qui elle-même renvoie la valeur de 42. Ils sont deux choses différentes.42
😉Lorsque vous revenez
b
, c'est juste une référence à la fonction b, mais ne pas être exécuté à ce moment.Lorsque vous revenez
b()
, vous êtes l'exécution de la fonction et renvoie sa valeur.Essayer
alert
ingtypeof(s)
dans vos exemples. Extrait de b vous donnera "fonction". Ce sera un extrait de vous donner?s
. Essayezreturn this
au lieu dereturn b
si ... Vous serez capable de le faires.b()
alors 😉Imaginer la fonction comme un type, comme un int. Vous pouvez retourner ints dans une fonction.
Vous pouvez retourner les fonctions de trop, ils sont l'objet de type "fonction".
Maintenant le problème de syntaxe: parce que les fonctions renvoie des valeurs, comment pouvez-vous retourner une fonction et pas la valeur de retour?
en omettant les supports! Parce que sans les crochets, la fonction ne sera pas exécuté! Donc:
Sera le retour de la "fonction" (les imaginer comme si vous retournez un nombre), alors que:
Exécute pour la première fois la fonction puis retour à la valeur obtenue par l'exécution, c'est une grande différence!
Créer un variable:
Déclarer un Fonction:
Alerte le valeur de
thing1
(notre première variable):Maintenant, si nous voulions
thing1
être un référence à la fonctionsomething1
, ce serait la même chose que créé notre fonction, nous ferions:Cependant, si nous voulions la
return
valeur de la fonction, nous devons affecter la valeur de retour de la fonction. Vous exécutez la fonction à l'aide de parenthèses:C'est super utile dans la vie réelle.
De travail avec Express.js
Donc votre
express
route ressemble à ceci:Mais que faire si vous avez besoin d'ajouter un peu de wrapper, gestionnaire d'erreur ou qch?
Puis vous appelez votre fonction d'un wrapper.
Semble compliqué? Eh bien, comment à ce sujet:
Voir à la fin vous êtes de passage d'une fonction
loggingWrapper
avoir un argument comme un autre fonctionitWorksHandler
, et votreloggingWrapper
retourne une nouvelle fonction qui prendreq, res, next
comme arguments.