Mittels einer Funktion kann man einen Anweisungsblock zusammenfassen und mit einem Namen versehen (= Funktionsdeklaration).
Unter diesem Namen kann der Programmblock angesprochen und in anderen Anweisungen, ohne den Programmcode immer wieder neu schreiben zu müssen, verwendet werden (= Funktionsaufruf).
In diesem Sinn kann man eine Funktion auch als Abkürzung für einen Programmblock betrachten. Dadurch kann die Lesbarkeit von komplexeren Programmen erhöht werden. Denn eine längere Programmsequenz wird durch einen sprechenden Namen abgekürzt. Man kann sich dadurch vorstellen, was beim Funktionsaufruf passiert und eine detailierte Definition erfolgt später (z.B. weiter unten im Programmcode).
Innerhalb des Anweisungsblocks der Funktion können Variable vorkommen, die vor Beginn der Abarbeitung des Blocks mit konkreten Startwerten belegt sein müssen. Diese Varibalen speichern den Input der Funktion und werden auch als Eingabeparameter bezeichnet. Bei einem Funktionsaufruf werden an diese Eingabeparameter die Startwerte übergeben.
Bei der Abarbeitung des Anweisungsblocks werden diese Eingabewerte verwendet, um bestimmte Anweisungen und Berechnungen durchzuführen.
Als Ergebnis eines Funktionsaufrufs und der dadurch ausgelösten Anweisungen (Berechnungen) kann ein bestimmter (Speicher-)Zustand als Ausgabewert zurückgegeben (= return-Anweisung) werden. Dieser Rückgabewert kann anschließend in einer Varibalen zwischengespeichert oder innerhalb eines Terms weiterverarbeitet werden.
Man sollte immer vor einer Funktionsdeklaration in einem Kommentar die Funktion allgemein beschreiben und die Ein- und Ausgabeparameter, deren Typ und Bedeutung genau angeben.
Es gibt Funktionen, die ohne Input und Output auskommen. Siehe die nachfolgende Funktion fillStage().
Manche Funktionen liefern ohne Input einen Output. Wiederum andere benötigen einen Input, liefern jedoch keinen Output.
Welchen Sinn haben Funktionen, die keinen Output liefern?
Man könnte annehmen, dass Funktionen, die keinen Output liefern, sinnlos sind.
Streng genommen ist das auch so, wenn man eine Funktion als abgeschlossene Input-Output-Maschine betrachtet, die Input erhält, während der Abarbeitung keinen "Kontakt nach außen" hat (keine side-effects) und abschließend den Output zurückliefert.
In vielen Programmiersprachen können jedoch im Anweisungsblock einer Funktion sogenannte globale Variable verändert oder Methoden aufgerufen werden, die zu einer Gesamtzustandsveränderung führen, obwohl die Funktion keinen Rückgabewert liefert. In diesem Fall hat die Ausführung der Funktion side-effects und liefert einen "versteckten" Output.
In der Regel sollte man side-effects vermeiden.