Funktionale Argumente in JavaScript
Hinweis für den Dozenten ► Hier sollten zumindest die Übungsfragen behandelt werden!
- Die in dieser Lektion behandelte Übergabe funktionaler Argumente (Rückruftechnik) macht jedoch das Prinzip solcher Funktionen wie »AddEventListener« verständlich.
Ein Parameter kann auch als Funktion verwendet werden. Bei der folgenden Definition der Funktion »m« wird der Parameter »f« auf der rechten Seite als eine Funktion verwendet.
- Auswertung
m = f => f( 9 )
function m()
Nun kann beim Aufruf eine Funktion als Argument übergeben werden. Im folgenden Beispiel wird die Funktion »this.Math.sqrt« als Argument übergeben. Die Auswertung von »f( 9 )« ergibt dann »this.Math.sqrt( 9 )«, also »3«.
- Auswertung
m( this.Math.sqrt )
3
Unter einem funktionalen Argument verstehen wir hier ein solches Argument wie »this.Math.sqrt«, das selber eine Funktion ist.
Wir können aber genausogut eine anonyme Pfeilfunktion als Argument übergeben.
- Auswertung
m( x => x * x )
81
Man kann die Bedeutung der Funktion »m« beschreiben, indem man sagt, daß diese eine ihr übergebene Funktion für den Wert »9« auswertet.
Da JavaScript den Namen des globalen Eintrages »f« an der Position vom Namen des Parameters »f« unterscheiden kann, darf man auch für beide denselben Namen »f« verwenden.
- Auswertung
f = f => f( 9 )
function f()
- Auswertung
f( this.Math.sqrt )
3
- Auswertung
f( x => x * x )
81
Auch bei der voranstehenden Auswertung könnte man wieder »f« als Parametername verwenden. Trotz der Namensgleichheit ist dies dann ein anderer Parameter als der in der Definition der Funktion »f« verwendete, weil er zu einer anderen Funktion gehört.
- Auswertung
f( f => f * f )
81
Sogar bei einer direkten Anwendung einer Funktion auf eine andere kann JavaScript die beiden Parameter unterscheiden.
- Auswertung
( f => f( 9 ) )( f => f * f )
81
Die letzte Klammer »( f => f * f )« drückt einfach eine Quadrierfunktion aus, für die der für ihren Parameter gewählte Name keine Rolle mehr spielt, man könnte genauso gut auch »( x => x * x )« schreiben, um eine gleichwertige Funktion zu definieren. Diese Quadrierfunktion wird dann von der ersten Funktion »( f => f( 9 ) )« auf »9« angewendet.
- Auswertung
quadrierfunktion = f => f * f
function quadrierfunktion()
- Auswertung
( f => f( 9 ) )( quadrierfunktion )
81
- Auswertung
quadrierfunktion( 2 )
4
- Auswertung
quadrierfunktion = x => x * x
function quadrierfunktion()
- Auswertung
( f => f( 9 ) )( quadrierfunktion )
81
- Auswertung
quadrierfunktion( 2 )
4
Notiz
main.js
WertBeiVier = f => f( 4 )
print( WertBeiVier( Math.sqrt ))
print( WertBeiVier( x => x + 2 ))
- Protokoll
2
6
Übungsfragen
? Übungsfragen
Können Sie die Werte der folgenden Ausdrücke vorhersagen?
- Ausdruck
( f => f( 9 ))( Math.sqrt )
- Ausdruck
( f => f( 9 )+ f( 16 ))( Math.sqrt )
- Ausdruck 1
( f => f( 2 )* f( 3 ))( x => x + 1 )
- Ausdruck 2
( x => x() )( x => 2 )
? Übungsfrage ⃖
Welche Ausgabe erzeugt die folgende Sequenz?
main.js
console.log( 2 );
? Übungsfrage (1) ⃖
Welche Ausgabe erzeugt die folgende Sequenz?
main.js
f = ()=> console.log( 3 );
{ f(); f(); }
? Übungsfrage (2) ⃖
Welche Ausgabe erzeugt die folgende Sequenz?
main.js
f = ()=> console.log( 3 );
g = x=>{ x(); x(); }
g( f )
? Übungsfrage (3) ⃖
Welche Ausgabe erzeugt die folgende Sequenz?
main.js
f = ()=> console.log( 3 );
h = ()=> console.log( 4 );
g = x=>{ x(); x(); }
g( f );
g( h )
? Übungsfrage (4) ⃖
Welche Ausgabe erzeugt die folgende Sequenz?
main.js
f = ()=> console.log( 3 );
g = x=>{ x(); x(); }
g( f() )