Signatur
Beschreibung
this ist ein besonderes Schlüsselwort, das innerhalb einer Funktion auf den aktuellen Ausführungskontext zeigt. Anders als in vielen klassenbasierten Sprachen hängt der Wert in JavaScript nicht davon ab, wo eine Funktion definiert wurde. Entscheidend ist, wie sie aufgerufen wird. Bei Pfeilfunktionen ist das anders.
Die wichtigsten Regeln:
- Methodenaufruf
obj.methode():thisistobj. - Einfacher Funktionsaufruf
fn(): Im Strict Mode (also auch in ES-Modulen und Klassen) istthisundefined, sonst das globale Objekt (globalThis). - Konstruktoraufruf
new Fn():thisist das neu erzeugte Objekt. - Explizite Bindung mit
call(),apply()oderbind():thisist das übergebene Objekt. - Pfeilfunktionen haben kein eigenes
this. Sie übernehmen es lexikalisch aus dem umgebenden Gültigkeitsbereich. - DOM-Event-Handler, die als normale Funktion registriert werden, erhalten das Element, an dem der Listener hängt (
event.currentTarget).
Auf oberster Ebene gilt: In einem klassischen Skript ist this das globale Objekt (im Browser window). In einem ES-Modul ist es undefined, in einem CommonJS-Modul von Node.js module.exports. In Klassen verweist this in Instanzmethoden und Klassenfeldern auf die Instanz, in statischen Methoden auf die Klasse selbst.
Rückgabewert
undefined (Strict Mode) oder im Strict Mode auch ein primitiver Wert, wenn einer per call/apply übergeben wurde.Beispiele
Methodenaufruf und Verlust des Kontexts
'use strict';
const konto = {
inhaber: 'Anna',
gruss() {
return `Hallo, ${this?.inhaber}`;
}
};
console.log(konto.gruss()); // this === konto
const losgeloest = konto.gruss;
console.log(losgeloest()); // this === undefined
const gebunden = konto.gruss.bind(konto);
console.log(gebunden());
Pfeilfunktion übernimmt this in Callbacks
class Zaehler {
wert = 0;
starten() {
// Die Pfeilfunktion übernimmt this aus starten() → Instanz
const id = setInterval(() => {
this.wert++;
console.log(`Wert: ${this.wert}`);
if (this.wert === 3) clearInterval(id);
}, 100);
}
}
new Zaehler().starten();
Explizite Bindung mit call und apply
function vorstellen(stadt, land) {
return `${this.name} wohnt in ${stadt}, ${land}.`;
}
const person = { name: 'Ben' };
console.log(vorstellen.call(person, 'Wien', 'Österreich'));
console.log(vorstellen.apply(person, ['Zürich', 'Schweiz']));
this in DOM-Event-Handlern
const button = document.querySelector('#speichern');
// Normale Funktion: this ist das Element mit dem Listener
button.addEventListener('click', function () {
this.disabled = true;
console.log(this === button);
});
// Pfeilfunktion: this stammt aus dem äußeren Bereich (im Modul undefined)
button.addEventListener('click', (event) => {
console.log(event.currentTarget === button);
});
// Wichtig · Fallstricke
- Kontextverlust: Wird eine Methode als Callback übergeben, etwa
setTimeout(obj.methode)oderarr.map(obj.methode), geht die Bindung anobjverloren. Abhilfe schaffenbind(), eine Pfeilfunktion als Hülle (() => obj.methode()) oder eine Pfeilfunktion als Klassenfeld. - Pfeilfunktionen als Objektmethoden sind meist ein Fehler:
{ f: () => this }verweist nicht auf das Objekt. Außerdem lässt sichthisbei Pfeilfunktionen weder mitcall/apply/bindnoch mitnewändern. - Strict Mode vs. Sloppy Mode: Ohne Strict Mode zeigt
thisbei einfachen Aufrufen aufglobalThis. Schreibzugriffe erzeugen dann unbemerkt globale Variablen. Primitive Werte werden in dem Fall in Objekte umgewandelt (Boxing). - Mit
bind()gebundene Funktionen lassen sich nicht neu binden. Nurnewkann die Bindung überschreiben. - In abgeleiteten Klassen darf
thisim Konstruktor erst nachsuper()verwendet werden. Sonst gibt es einenReferenceError. - Für einen umgebungsunabhängigen Zugriff auf das globale Objekt verwendet man
globalThis(ES2020) stattthisauf oberster Ebene. - Die Grundregeln werden von allen Browsern unterstützt. Pfeilfunktionen und Klassenfelder setzen ES2015 bzw. ES2022 voraus.