Erstklassige Funktionen (englisch First-Class Functions) sind eine Spracheigenschaft: Funktionen können wie alle anderen Werte behandelt werden. Man kann sie in Variablen speichern, als Argumente übergeben, von Funktionen zurückgeben und in Datenstrukturen ablegen — ganz so wie Zahlen, Zeichenketten oder Objekte.
Was Funktionen als Werte ermöglichen
Sprachen mit Erstklassigen Funktionen erlauben Muster, die sonst umständlich wären:
const verdoppeln = x => x * 2;
const zahlen = [1, 2, 3];
zahlen.map(verdoppeln); // [2, 4, 6]
Die Funktion verdoppeln wird hier in einer Variablen gespeichert und an map übergeben. Solche Funktionen heißen auch Funktionen erster Ordnung im Gegensatz zu Funktionen höherer Ordnung, die Funktionen verarbeiten.
Voraussetzung für moderne Muster
- Higher-Order-Funktionen wie
map,filterundreducenehmen Funktionen entgegen oder geben sie zurück - Callbacks und Event-Handler übergeben Verhalten als Wert
- Closures entstehen nur in Sprachen mit Erstklassigen Funktionen, weil Funktionen erst dadurch als Werte gespeichert und weitergereicht werden können
- Dekorierer, Middleware und Funktions-Komposition bauen Funktionen zu neuen Funktionen
Sprachvergleich
JavaScript, Python, Haskell, Scala und Elixir behandeln Funktionen als erstklassig. In C sind Funktionszeiger ein Sonderkonstrukt, in Java vor den Lambda-Ausdrücken funktionale Interfaces — dort sind Funktionen also nicht im engeren Sinne erstklassig, sondern werden über Hilfskonstrukte nachgebildet.
Abgrenzung
Erstklassige Funktionen beschreiben den Status von Funktionen als Werten in einer Sprache. Eine Higher-Order-Funktion nutzt diesen Status, indem sie Funktionen entgegennimmt oder zurückgibt. Beide Konzepte hängen eng zusammen: Ohne Erstklassige Funktionen gibt es keine Higher-Order-Funktionen im eigentlichen Sinn. Das Fundament dieser Sichtweise ist der Lambda-Kalkül, in dem Funktionen die einzigen Werte sind. Verwandte Grundlagen: Funktionale Programmierung, JavaScript-Befehle.