Funktionsausdrücke in JavaScript
Syntax
Wenn einem Ausdruck »()=>« vorangestellt wird, ergibt sich wieder ein Ausdruck. (Dies ist ähnlich wie bei einem Vorzeichenoperator.)
Den sich ergebenden gesamten Ausdruck nennen wir Funktionausdruck oder Klammerpfeilausdruck. Den darin enthaltenen Ausdruck nennen wir auch den inneren Ausdruck des Klammerpfeilausdrucks.
Einen Klammerpfeilausdruck nennen wir auch kurz einen einen Pfeilausdruck oder einen Pfeil.
Semantik
Der Wert eines Funktionsausdrucks ist eine Funktion, deren Aufruf den Wert des inneren Ausdrucks hat. Deswegen ist jeder Klammerpfeilausdruck auch ein Funktionsausdruck.
»()=>x « ist eine Funktion, deren Aufruf den Wert »x « hat. ☁
Beispielsweise hat der Aufruf »( ()=> 1 )()« dem Wert »1«.
Eine Funktion, die der Wert eines Ausdruck mit einem Pfeil »=>« ist, nennen wir auch eine Pfeilfunktion. (Hierbei müßte man genau genommen sagen, daß der Pfeil »=>« dabei mindestens einmal außerhalb eines Operanden oder Arguments vorkommen darf.)
- Auswertung
()=> 1
function ()
- auf deutsch
- Eine Funktion, deren Aufruf den Wert »1« ergibt
Solch ein Funktionsausdruck muß in vielen Fällen in runde Klammern eingeschlossen. Für den Anfang ist es am sichersten, Funktionsausdrücke immer einzuklammern. Deswegen zeigen wir hier den eingeklammerten Funktionsausdruck.
- Ausdruck
( ()=> 1 )
Der Aufruf erfolgt, wie bei den bisher schon vorgestellten Funktionen, durch ein nachgestelltes Klammerpaar.
- Auswertung
( ()=> 1 )()
1
Man kann sich vorstellen, daß ein Ausdruck durch Voranstellen von »()=>« in eine Funktion „verpackt“ werden kann. Durch Nachstellen von »()« wird der Ausdruck dann ausgewertet.
Daher kann man sich »()=> 1« auch als „Aufruf, dann 1“ merken, das heißt, wenn ein Aufruf »()« erfolgt, dann »=>« soll sich der Wert »1« ergeben.
Durch das Voranstellen eines Pfeiles wird die Auswertung des inneren Ausdrucks zunächst verzögert : Die Auswertung des Funktionsausdrucks ergibt eine Funktion, aber der in der Funktion enthaltene innere Ausdruck wird dabei noch nicht ausgewertet. So kann der innere Ausdruck als Teil der Funktion auch weitergereicht werden: er kann als an Funktionen übergeben werden und dann erst später (oder nie) ausgewertet werden.
Merkhilfe
Wir hatten für die Aussprache des Aufrufoperators »()« früher schon „Aufruf“ vorgeschlagen.
Der „Pfeil“ »=>« erinnert etwas an die Bedeutung „wenn, dann“.
Daher kann man »()=>1« als „wenn Aufruf, dann 1 “ verstehen.
Beim Aufruf von »()=>1« soll sich also der Wert «1» ergeben.
Typ
Der Typ eines Funktionsausdruck ist »function«.
- Auswertung
typeof( ()=> 1 )
"function"
Gleichheit von Pfeilfunktionen
Zwei Funktionen, die durch Auswertung zweier Pfeilausdrücke erzeugt werden, gelten als ungleich, selbst dann, wenn beide Pfeilausdrücke aus genau denselben Zeichen bestehen und beide Funktionen den gleichen Wert ergeben.
- Auswertung
( ()=> 1 )===( ()=> 1 )
false
Jede Pfeilfunktion wird bei der Auswertung eines Klammerpfeilausdrucks mit einer versteckten Seriennummer versehen. Die beiden Funktionen auf den beiden Seiten des obigen Vergleichsoperators enthalten zwar die gleiche Berechnungsvorschrift, aber sie haben zwei verschiedene interne Seriennummern und gelten deswegen als ungleich.
In dem folgenden Beispiel wird der Wert zweier Funktionsaufrufe verglichen, während in dem voranstehendem Beispiel die Funktionen selber verglichen wurden. Während die beiden Funktionen selber als unterschiedlich gelten, sind die Werte ihrer Aufrufe gleich (beide sind gleich »1«).
- Auswertung
( ()=> 1 )() === ( ()=> 1 )()
true
Prioritäten
- Eigenschaften von Operatoren
A P A (A = Aritaet, P = Position [Zirkumfix, Praefix, Infix], A = Assoziativitaet)
() 1 Z Eingeklammerter Ausdruck
+ - typeof 1 P Unaere vorangestellte Operatoren (Vorzeichen)
* / 2 I L "Punktrechnung": Multiplikation, Division
+ - 2 I L "Strichrechnung": Addition, Subtraktion
< 2 I L Kleiner
=== !== 2 I L Gleichheit, Ungleichheit
= 2 I R Zuweisung
()=> 1 P Pfeil
Motivation
Es ist an dieser Stelle des Kurses noch nicht gleich erkennbar, welchen Nutzen die Verpackung eines Ausdrucks in eine Funktion hat. Doch sind Funktionen eines der wichtigsten Arbeitsmittel in JavaScript. Wenn der Nutzen eines Funktionsausdrucks an dieser Stelle des Kurses noch nicht erkennbar ist, so liegt dies daran, daß wir hier einerseits stark vereinfacht haben und andererseits noch einige andere Möglichkeiten der Sprache noch nicht behandelt wurden, mit denen zusammen der Nutzen von Funktionsausdrücken erst richtig erkennbar wird. Der Leser sollte aber doch schon hier die einfachsten Grundlagen von Funktionsausdrücken erlernen, weil es später vermutlich beim Lernen hilft, schon etwas mit Funktionsausdrücken vertraut zu sein.
Übungsfragen
? Übungsfragen
Welchen Wert hat der folgende Ausdruck?
- Ausdruck (0)
( ()=> 3 )()
Welchen Typ hat der folgenden Ausdruck?
- Ausdruck (1)
( ()=> 3 )
Welchen Typ hat der folgenden Ausdruck?
- Ausdruck (2)
( ()=> 3 )()
Welchen Wert hat der folgende Ausdruck?
- Ausdruck (3)
typeof ( ()=>1 )
Welchen Wert hat der folgende Ausdruck? (Der nachgestellte Aufruf hat eine höhere Priorität als der vorangestellte Operator »typeof«.)
- Ausdruck (4)
typeof ( ()=>1 )()
Übungsaufgaben
? Übungsaufgabe
Schreiben Sie einen Funktionsausdruck für eine Funktion, die den Text "abc" ergibt.
Details zur Syntax ⃗
- Ein Funktionsausdruck
Ausdruck
.-. .-. .--. .----------.
--->( ( )--->( ) )ooo>( => )--->| Ausdruck |--->
'-' '-' '--' '----------'
Im Syntaxdiagramm kennzeichnet die dicke Verbindung »ooo>« eine Stelle, an der zwar sonstiger Leerraum, aber kein Zeilenende geschrieben werden darf.
- Protokoll
()=>0
(keine Fehlermeldung)
- Protokoll
() =>0
(ebenfalls keine Fehlermeldung)
- Protokoll
()
=>0SyntaxError: no line break is allowed before '=>'
Auch innerhalb eines mit »/*« eingeleiteten Kommentars darf an jener Stelle kein Zeilenende stehen. Ein mit »/*« eingeleiteter Kommentar, der ein Zeilenende enthält, wird nämlich nicht durch ein Leerzeichen, sondern durch ein Zeilenende ersetzt.
- Protokoll
()/*
*/=>0SyntaxError: no line break is allowed before '=>'
An anderen Stellen zwischen zwei lexikalischen Einheiten ist ein Zeilenende aber erlaubt.
- Protokoll
()=>
0(keine Fehlermeldung)