Jackson a partiellement répondu à cela dans une question similaire:
Retour implicite, mais uniquement s'il n'y a pas de bloc.
- Cela entraînera des erreurs lorsqu'une ligne unique se développe en plusieurs lignes et que le programmeur oublie d'ajouter un fichier
return
.
- Le retour implicite est syntaxiquement ambigu.
(name) => {id: name}
renvoie l'objet {id: name}
... non? Faux. Il revient undefined
. Ces accolades sont un bloc explicite. id:
est une étiquette.
J'ajouterais à cela la définition d'un bloc :
Une instruction de bloc (ou une instruction composée dans d'autres langues) est utilisée pour regrouper zéro ou plusieurs instructions. Le bloc est délimité par une paire de crochets.
Exemples :
// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})()
// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')
// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')
// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess')
// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess')
// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess')
// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess')
name
avec la fonction entre parenthèses et appelée avec un argument, "Jess". Le code entre le=>
et)('Jess')
dans chaque cas est le corps de la fonction de flèche. Considérez-le comme une forme courte d'une expression de fonction immédiatement invoquée de la forme(function (name) { return { id: name } })('Jess')
{}
) ou un bloc , il suppose que a{ }
désigne un bloc. Cela signifie que lorsqu'il voitid: name
, il pense queid:
c'est une expression créant une étiquette (une fonctionnalité très peu utilisée de JS qui traite du contrôle de flux et utilise a:
), puis ce quiname
suitid:
est simplement une instruction séparée qui ne contient que la variablename
(& ne fait rien).Je comprends cette règle de base ...
Les candidats sont:
Pour les autres opérations (plus de one-liners qui nécessitent un bloc, le retour doit être explicite
la source
Il y a un autre cas ici.
Lors de l'écriture d'un composant fonctionnel dans React, vous pouvez utiliser des parenthèses pour encapsuler le JSX renvoyé implicitement.
la source
Voici un autre cas qui m'a posé des problèmes.
Ici, nous définissons une fonction retournant une fonction anonyme. Le point "délicat" est que le corps de la fonction externe (la partie commençant par (bar) => ...) ressemble visuellement à un "bloc", mais ce n'est pas le cas. Comme ce n'est pas le cas, le retour implicite entre en jeu.
Voici comment wrap s'exécuterait:
La façon dont j'ai déballé ceci pour m'assurer que je comprenais c'était de "désarrimer" les fonctions.
Voici l'équivalent sémantique du premier bloc de code, faisant simplement que le corps de wrap () fasse un retour explicite. Cette définition produit les mêmes résultats que ci-dessus. C'est là que les points se connectent. Comparez le premier bloc de code ci-dessus avec celui ci-dessous, et il est clair qu'une fonction de flèche elle-même est traitée comme une expression, pas un bloc, et a le retour implicite .
La version entièrement non fléchée de wrap serait comme ça, qui, bien que pas aussi compacte que la version grosse flèche vers le haut, semble beaucoup plus facile à comprendre.
En fin de compte, pour les autres qui devront peut-être lire mon code, et à l'avenir moi, je pense que je préférerais aller à la version sans flèche qui peut être comprise visuellement à première vue, plutôt que la version flèche qui prend un peu de pensé (et dans mon cas l'expérimentation) à grok.
la source
Les fonctions fléchées vous permettent d'avoir un retour implicite: les valeurs sont renvoyées sans avoir à utiliser le
return
mot - clé.Cela fonctionne quand il y a une instruction en ligne dans le corps de la fonction:
Autre exemple, renvoyer un objet (n'oubliez pas de mettre les accolades entre parenthèses pour éviter qu'il ne soit considéré comme les crochets du corps de la fonction d'habillage):
la source