J'ai appris qu'une fonction pure est une fonction qui ne modifie pas l'état global, point final. Si cela est vrai, les fonctions dans les fonctions peuvent modifier l'état de la fonction externe et être toujours pures, correct?
Exemple:
function func1() { let name = "My Name" func2(name) function func2(name) { // use name here. } }
Dans l'exemple ci-dessus, func2
est toujours pur car il n'utilise aucun état global.
C'est comme ça que je vois, mais mes collègues de travail pensent que func2
n'est pas pur, et il devrait être écrit comme suit:
function func1() { let name = "My Name" func2() function func2() { // alter name here. } }
Ce qui est mauvais, car:
La question est: qu'est-ce qu'une fonction pure quand on parle d'une fonction dans une fonction?
4 Réponses :
La pureté n'est pas définie pour se soucier uniquement des variables globales, elle se soucie de tout variables non locales (et plus) qui ne devraient pas être mutées. Une variable externe d'une fermeture compte toujours comme non locale, elle n'a pas besoin d'être globale.
Donc, si func2
change le nom
, alors c'est impur. Le fait que func1
devienne également impur dépend de la question de savoir si vous ne considérez que la pureté externe - tant que name
et func2
restent locaux dans la fonction, il peut encore être pur.
J'ai appris qu'une fonction pure est une fonction qui ne modifie pas l'état global, point final.
Eh bien, c'est trop simpliste. Une fonction pure devrait avoir un, pas d'effets secondaires, et deuxièmement, son résultat ne devrait reposer que sur les arguments. Donc, en corollaire, aucun état. La propriété name
de votre func1
ressemble étrangement à un état. Pourrais-je le faire muter? Est-ce que func1 ()
donnera des résultats différents en fonction des appels précédents? Impur!
Bien sûr, func2 étant impur est incontestable. Vous avez écrit «altère le nom» - «nom» est hors de sa portée. C'est un effet secondaire.
Une fonction pure est une fonction qui répond à 2 exigences:
Côté les effets peuvent être définis comme "tout changement d'état de l'application observable en dehors de la fonction appelée autre que sa valeur de retour" .
Pour être plus précis:
Une fonction qui modifie quoi que ce soit en dehors de sa portée (même si ce n'est pas la portée globale) n'est pas une fonction pure.
Dans votre exemple, si func2 modifie une variable en dehors de sa propre portée, alors ce n'est pas une fonction pure:
function func1() { let name = "My Name"; // <-- the variable is not in the global scope but, in any case, it is outside the scope of func2 func2(); function func2() { // alter name here. } }
Un autre exemple que je pense qu'il vaut la peine de mentionner est la fonction pure suivante:
function insert(DB, user) { return function() { throwIfUserExists(DB, user); var savedUser = saveUser(DB, user); return savedUser; } }
Notez que lorsque vous appelez insert
, comme tant que vous continuez à envoyer dans le même DB
et user
, vous recevrez le même résultat que la fonction renvoie une autre fonction - aucun effet secondaire ne se produit.
p>
utilisez! = modifier. De quoi parlez-vous?
@Bergi J'aimerais connaître votre opinion sur les deux choses.