Funktionsausdrücke in JavaScript (Funktionsausdrücke in JavaScript), Lektion, Seite 723574
https://www.purl.org/stefan_ram/pub/funktionsausdruck_javascript (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
JavaScript-Kurs

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
()
=>0
SyntaxError: 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
()/*
*/=>0
SyntaxError: no line break is allowed before '=>'

An anderen Stellen zwischen zwei lexikalischen Einheiten ist ein Zeilenende aber erlaubt.

Protokoll
()=>
0
(keine Fehlermeldung)

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723574 stefan_ram:723574 Funktionsausdrücke in JavaScript Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723574, slrprddef723574, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/funktionsausdruck_javascript