È una buona idea mantenere calcolo dei valori (espressioni) separato da esecuzione di azioni (dichiarazioni). Vogliamo un controllo preciso su dove e quando verranno intraprese le azioni (come la visualizzazione dei messaggi), ma nel calcolo dei valori preferiremmo lavorare a un livello più astratto e non dovremmo preoccuparci di come quei valori sono calcolata.
Una funzione che calcola solo un valore di ritorno, usando solo gli argomenti che ha dato, è chiamata pure .
Una "funzione" che esegue un'azione è in realtà una procedura , che ha un effetto .
Qualsiasi effetto causato durante il calcolo di un valore è chiamato effetti collaterali , ed è meglio evitarli dove possibile ("Avevo solo bisogno di quella stringa, non sapevo che avrebbe martellato il banca dati! ").
Per ridurre al minimo la possibilità di effetti collaterali, dovremmo evitare di inviare troppi dati alle nostre procedure o di inserire qualsiasi calcolo al loro interno; se alcuni calcoli devono essere eseguiti in anticipo, di solito è meglio farlo separatamente in una funzione pura, quindi passare solo il risultato richiesto alla procedura. Ciò mantiene chiaro lo scopo della procedura e riduce la possibilità che possa essere riutilizzato in un secondo momento come parte di un calcolo (la funzione pura può invece essere riutilizzata).
Per lo stesso motivo, dovremmo evitare di elaborare i risultati all'interno di una procedura. È meglio restituire il risultato (se esiste) alla nostra azione ed eseguire qualsiasi elaborazione successiva con funzioni pure.
Se seguiamo queste regole, potremmo finire con una procedura come sayHello
, che non ha bisogno di dati e non ha un risultato. Quindi la migliore interfaccia è di non avere argomenti e non restituire un valore. È preferibile, ad esempio, chiamare "console.log" nel mezzo di alcuni calcoli.
Per ridurre la necessità di effetti durante il calcolo, possiamo avere calcoli che restituiscono procedure ; per esempio. se dobbiamo decidere su un'azione da intraprendere, possiamo avere una funzione pura scegliere una procedura e restituirla, piuttosto che eseguirla direttamente.
Allo stesso modo, per ridurre la necessità di calcolo durante le procedure, possiamo avere procedure che prendono altre procedure come parametri (probabilmente il risultato di una funzione); per esempio. prendendo una serie di procedure e eseguendo una dopo l'altra.