Quando / come è possibile ridefinire / dichiarare le variabili? [funzionale]

1

Ultimamente sto imparando la programmazione funzionale in javascript, e c'è una cosa che mi ha confuso. Non riesco a capire se è sempre possibile ridefinire le variabili.

Qualcosa come: a = a + 1 lancia immediatamente bandiere rosse. a sta mutando, quindi è un no go. E certamente dichiarando una variabile in questo modo: var a = 10 va bene, dopotutto stiamo solo dando allo stato 10 un nome. Ma che dire di qualcosa di simile:

function f(x){
  var y = x;
  return y + x;
}
/*overlooking the fact that this code
has no meaningful purpose and could be
simplified as return 2 *x;*/

È permesso? Dichiarare la variabile y va bene, ma cosa succede se chiamiamo f (x) due volte? Che ne dici di scrivere questa affermazione con la ricorsione? È la ridichiarazione della variabile y più volte ok? Oppure è y solo una variabile che esiste solo durante il periodo in cui la funzione nidificata è in esecuzione.

Mentre cercavo la risposta a questa domanda, mi sono imbattuto in una pagina sulle funzioni pure e impure. Considero che la purezza non è una programmazione funzionale esclusiva. Ulteriori scavi mi hanno detto che dichiarare le variabili all'interno di una funzione potrebbe potenzialmente portare a impurità. Quindi, anche se potessi dichiarare variabili nell'ambito di una funzione, sarebbe problematico? Quali regole devo rispettare per evitare di compromettere la purezza delle mie funzioni?

    
posta Ucenna 29.09.2016 - 15:02
fonte

1 risposta

2

Il tuo esempio va bene, perché è una nuova y in ogni invocazione della funzione. Una semplice regola è "appare a sinistra di = esattamente una volta, al punto della dichiarazione".

La "purezza" della funzione è generalmente in riferimento alla mancanza di effetti collaterali, che sta interessando qualsiasi cosa al di fuori della funzione (ad esempio, l'incremento di un contatore globale, la scrittura in un file, ecc.).

function impure(x) {
    x.y = 10; // Modifying x here
    return x.y * 5;
}

function pure(x) {
    var y = 10;
    return x + y + 5;
}
    
risposta data 29.09.2016 - 15:17
fonte

Leggi altre domande sui tag