Es ist eine gute Idee, die Berechnung von Werten (Ausdrücken) von der Ausführung von Aktionen (Anweisungen) getrennt zu halten . Wir wollen genau steuern, wo und wann Maßnahmen ergriffen werden (wie das Anzeigen von Nachrichten), aber bei der Berechnung von Werten arbeiten wir lieber auf einer abstrakteren Ebene und müssen uns nicht darum kümmern, wie diese Werte berechnet werden.
Eine Funktion, die nur einen Rückgabewert unter Verwendung der angegebenen Argumente berechnet, heißt pure .
Eine "Funktion", die eine Aktion ausführt, ist eigentlich eine Prozedur , die eine Wirkung hat .
Effekte, die während der Berechnung eines Wertes verursacht werden, werden als Nebenwirkungen bezeichnet . Es ist besser, sie nach Möglichkeit zu vermeiden ("Ich brauchte nur diesen String, ich wusste nicht, dass er die Datenbank hämmern würde!").
Um die Wahrscheinlichkeit von Nebenwirkungen zu minimieren, sollten wir vermeiden, zu viele Daten an unsere Verfahren zu senden oder Berechnungen anzustellen. Wenn eine Berechnung im Voraus durchgeführt werden muss, ist es normalerweise besser, sie separat in einer reinen Funktion durchzuführen und dann nur das erforderliche Ergebnis an die Prozedur zu übergeben. Dies hält den Zweck des Verfahrens klar und verringert die Wahrscheinlichkeit, dass es später als Teil einer Berechnung wiederverwendet wird (die reine Funktion kann stattdessen wiederverwendet werden).
Aus dem gleichen Grund sollten wir vermeiden, Ergebnisse innerhalb einer Prozedur zu verarbeiten. Es ist besser, das Ergebnis (falls vorhanden) unserer Aktion zurückzugeben und eine nachfolgende Verarbeitung mit reinen Funktionen durchzuführen.
Wenn wir diese Regeln befolgen, erhalten wir möglicherweise eine Prozedur wie die sayHello
, die keine Daten benötigt und kein Ergebnis hat. Daher ist es die beste Schnittstelle, keine Argumente zu haben und keinen Wert zurückzugeben. Dies ist beispielsweise vorzuziehen, wenn Sie "console.log" mitten in einer Berechnung aufrufen.
Um die Notwendigkeit von Effekten während der Berechnung zu verringern, können Berechnungen durchgeführt werden, die Prozeduren zurückgeben . z.B. Wenn wir uns für eine Aktion entscheiden müssen, kann eine reine Funktion eine Prozedur auswählen und zurückgeben, anstatt sie direkt auszuführen.
Um den Rechenaufwand bei Prozeduren zu verringern, können Prozeduren auch andere Prozeduren als Parameter verwenden (möglicherweise das Ergebnis einer Funktion). z.B. eine Reihe von Prozeduren nehmen und nacheinander ausführen.