Trasparenza referenziale significa che è possibile sostituire un'applicazione di funzione con il suo risultato (o più in generale, un'espressione con la sua valutazione) ovunque e / o ovunque nel programma, senza modificarne il risultato.
Ecco un esempio di un programma con una funzione che legge solo ma non modifica una variabile globale:
let global = 0;
function foo(i) {
return i + global;
}
const one = foo(1);
// foo(1) == 1
global = 100;
const two = foo(1);
// I should be able to replace this with const two = 1, since foo(1) was 1 above
console.log(two);
// 101
Questo stampa 101
.
Se foo
fosse referenzialmente trasparente, dovrei essere in grado di sostituire qualsiasi occorrenza di foo(1)
con 1
. E viceversa, dovrei essere in grado di sostituire qualsiasi occorrenza di 1
con foo(1)
.
Proviamo:
let global = 0;
function foo(i) {
return i + global;
}
const one = foo(1);
global = 100;
const two = 1;
console.log(two);
// 1
// Oops!
Come puoi vedere, la sostituzione di foo(1)
con il suo risultato modifica il significato del programma. Ergo, foo
non è referenzialmente trasparente.
C'è un'altra lezione importante qui: se global
fosse una costante anziché una variabile, allora foo
sarebbe referenzialmente trasparente. foo
non è referenzialmente trasparente a causa di un pezzo di codice completamente diverso da qualche altra parte. Gli effetti collaterali sono contagiosi e possono agire su grandi distanze!