3
votes

Qu'est-ce qu'une fonction pure lorsque nous parlons d'une fonction dans une fonction

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:

  • si la v8 n'optimise pas cela, le processeur exécutera plus d'instructions
  • l'observation est une mauvaise pratique

La question est: qu'est-ce qu'une fonction pure quand on parle d'une fonction dans une fonction?


2 commentaires

utilisez! = modifier. De quoi parlez-vous?


@Bergi J'aimerais connaître votre opinion sur les deux choses.


4 Réponses :


3
votes

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.


0 commentaires

1
votes

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.


0 commentaires

2
votes

Une fonction pure est une fonction qui répond à 2 exigences:

  1. Étant donné la même entrée, elle renverra toujours la même sortie.
  2. Ne produit aucun effet secondaire.

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.
  }
}


0 commentaires

0
votes

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>


0 commentaires