J'utilise une bibliothèque tierce qui a une fonction qui prend des fonctions en tant qu'arguments. Je fais des vérifications conditionnelles pour décider d'ajouter ou non une fonction particulière en tant que paramètre et, dans certains cas, je ne souhaite pas fournir de fonction. Fournir une valeur nulle dans ce cas génère une erreur.
J'ai trouvé ce code qui fonctionne, mais je ne comprends pas bien ce qui se passe.
compose(__DEV__ ? devTools() : f => f)
Est-ce que f => f
est équivalent à () => {}
une fonction anonyme vide?
f => f
est similaire * à function(f){ return f; }
Si proche, mais pas tout à fait ce que vous attendiez.
* - comme il a été souligné dans les commentaires, il existe des différences subtiles, mais pour l’intérêt de votre question, je ne pense pas qu’elles soient en particulier pertinentes. Ils sont très pertinents dans d'autres situations.
f => f
est la fonction d'identité . Il retourne simplement l'argument qui a été transmis.
Cette fonction est souvent utilisée comme valeur par défaut pour les processus de transformation, car elle n'effectue aucune transformation.
Est-ce que
f => f
est équivalent à() => {}
une fonction anonyme vide?
Non, la fonction vide ne renvoie rien. La fonction d'identité renvoie l'argument passé en argument.
Si vous voulez savoir ce que f => f
signifie, le côté gauche est le paramètre et le côté droit est la valeur de retour. Ainsi, par exemple, f => f*2
est équivalent à:
function(f) {
return f * 2;
}
Le code que vous décrivez renvoie tout ce qui lui est fourni en entrée.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
À tout moment avec le même dilemme, vous pouvez utiliser Babel pour obtenir la réponse.
Il est revenu comme ça:
"use strict";
(function (f) {
return f;
});
En passant, => vous avez utilisé une fonction ES6 appelée expression de flèche . L'autre manifestation d'intérêt
() => {}; // es6
se convertirait à:
(function () {});
Comme les expressions de fonction de flèche sont toujours anonymes , il est logique d'ajouter le nom à la fonction:
let empty = () => {}; // es6
se convertirait à
var empty = function empty() {};
D'autres ont déjà mentionné ce que f => f
fait, alors je ne vais pas approfondir cette question. Je vais juste expliquer le reste de la fonction, car il y a une petite différence entre f => f
et __DEV__ ? devTools() : f => f
L'opérateur ternaire vérifie si __DEV__
est une valeur de vérité et, dans l'affirmative, renvoie la fonction devTools()
. sinon, il retourne la fonction d'identité f => f
qui ne fait rien. Autrement dit: ce code active certaines fonctions du mode développement. Sans le code restant, il est difficile de dire ce que ce mode ajoute, mais il permettra vraisemblablement d’obtenir des informations de journalisation supplémentaires et d’obtenir moins d’obscurcissement.