Verzeichnisfunktionen in JavaScript
(Diese Lektion ist bisher zu knapp, aber es fehlt noch die Zeit, um sie ausführlicher zu formulieren.)
- Auswertung
v = { x: 2, f: function(){ return v.x; } }
- Auswertung
v.f()
2
- Auswertung
v = { x: 2, f: function(){ return this.x; } }
- Auswertung
v.f()
2
»this« steht bei einem normalen Aufruf in einer langen Funktion für das Ziel (den Verzeichnis vor dem Punkt).
Weil »this« leider nicht immer für das Hauptverzeichnis verwendet werden kann, wird in diesem Kurs auch „Ⓖ.“ (wie „global“) als kurze Schreibweise verwendet, die immer das globale Verzeichnis bedeutet.
Der Leser muß „Ⓖ“ bei der Eingabe durch einen Ausdruck für das globale Verzeichnis ersetzen. Vorläufig ist dieser Ausdruck immer »this«. Später werden wir aber sehen, daß es leider nicht immer möglich ist, »this« dafür zu verwenden.
»Ⓖ.Infinity« bedeutet also den Wert des Schlüssel »Infinity« im Hauptverzeichnis »Ⓖ.«. Bis auf weiteres muß dies als »this.Infinity« eingegeben werden.
Bis auf weiteres ist dann für das »this« das Wort »this« einzusetzen, so daß sich dann wieder »this.Infinity« ergibt.
In diesem Fall kann man »this« also nicht mehr verwenden, um sich auf das globale Verzeichnis »Ⓖ« zu beziehen! Weil »this« also nicht immer für das globale Verzeichnis steht, haben wir die Schreibweise »Ⓖ« eingeführt, die immer für das globale Verzeichnis steht, aber so leider nicht in JavaScript verwendet werden kann.
Das folgende Beispiel zeigt, daß »this« wirklich immer für das jeweilige Zielobjekt steht, und nicht für das Objekt, in dem der Funktionsausdruck enthalten ist.
- Auswertung
w = { x: 9, f: v.f }
- Auswertung
w.f()
9
Bei der Auswertung von »w.f()« steht das »this« nun für »w«, obwohl der Ausdruck für die Funktion in »v« enthalten ist. Aber der Wert von »this« ist das vor dem Punkt stehende Ziel und nicht das den Funktionsausdruck enthaltende Verzeichnis. »w.f« ist aber dieselbe Funktion wie »v.f«.
- Auswertung
w.f === v.f
true
Durch »call« kann der Wert von »this« aber auch ausdrücklich festgelegt werden.
- Auswertung
v.f.call( { x: 3 } )
3
Hier ist der Wert von »this« nun weder »v« noch »w«, sondern das call-Argument »{ x: 3 }«.
Innerhalb einer Pfeifunktion hat »this« aber die Bedeutung, die es an der Stelle der Definition der Pfeilfunktion hat; das heißt, daß eine Pfeilfunktion anders als eine lange Funktion dem »this« keine besondere Bedeutung verleiht. Wenn eine Funktionsausdruck mit Pfeilschreibweise beispielsweise direkt in einem Funktionausdruck mit langer Schreibweise enthalten ist, dann hat »this« in dem Funktionsausdruck mit Pfeilschreibweise denselben Wert wie in dem enthaltenden Funktionausdruck mit langer Schreibweise.
Gemeinsamer Bezug auf einen Aktivierungsverbund
- Auswertung
f = function( x ){ return { inc: ()=> x = x + 1, reset: () => x = 0 }; }
function f()
zaehler = f( 10 );
zaehler.inc()
11
zaehler.inc()
12
z = f( 0 );
z.inc();
1
z.inc();
2
zaehler.inc()
13
zaehler.reset()
0
z.inc();
3
zaehler.inc()
1