Skip to content

JavaScript im Detail - So funktioniert this in Methoden wirklich

Published: at 06:00 AMSuggest Changes

this in Methoden: Kontext ist König

In der objektorientierten Welt von JavaScript sind Methoden ein zentrales Konzept. Sobald eine Funktion als Teil eines Objekts verwendet wird, also eine sogenannte Methode ist, kommt das Schlüsselwort this ins Spiel. Was auf den ersten Blick einfach klingt, „this zeigt auf das aktuelle Objekt“, entpuppt sich in der Praxis oft als Quelle von Missverständnissen.

Gerade weil this in JavaScript nicht statisch gebunden ist, sondern vom Aufruf abhängt, kann es in Methoden zu unerwartetem Verhalten kommen. Das gilt insbesondere wenn Methoden aus dem Kontext gerissen, weitergegeben oder in Event-Handlern verwendet werden.

Methoden sind Funktionen mit Objektbezug

Zunächst einmal ist jede Methode eine Funktion, nur eben mit einem Objektbezug. Wird sie über das Objekt aufgerufen, verweist this auf genau dieses Objekt.

const user = {
  name: "Mira",
  greet() {
    console.log(`Hallo, ich bin ${this.name}`);
  }
};

user.greet(); // "Hallo, ich bin Mira"

In diesem Beispiel zeigt this in der Methode greet() ganz klar auf das Objekt user, da der Methodenaufruf über user.greet() erfolgt.

Methoden verlieren ihren Kontext schnell

Ein häufiger Stolperstein ist, dass Methoden ihren ursprünglichen Kontext verlieren können, wenn sie als Referenz übergeben werden. Dann wird this nicht mehr auf das ursprüngliche Objekt zeigen.

const person = {
  name: "Tarek",
  sayHi() {
    console.log(`Hi, ich bin ${this.name}`);
  }
};

const fn = person.sayHi;
fn(); // undefined oder Fehler, da `this` nicht mehr auf `person` zeigt

Das liegt daran, dass der Methodenaufruf hier nicht mehr über person, sondern direkt über fn() erfolgt und somit kein Bezug zu person besteht. Das ist kein Bug, sondern das normale, dynamische Verhalten von this.

Lösung: Methoden binden mit bind()

Um den Bezug zu this beizubehalten, kann man Methoden mit bind() an ein Objekt binden:

const boundSayHi = person.sayHi.bind(person);
boundSayHi(); // "Hi, ich bin Tarek"

bind() erzeugt eine neue Funktion mit festem this-Bezug. Alternativ können auch call() oder apply() genutzt werden, wenn die Methode sofort aufgerufen werden soll.

person.sayHi.call(person); // "Hi, ich bin Tarek"

this in verschachtelten Methoden oder Callbacks

In Methoden mit verschachtelten Funktionen oder Callbacks geht this ebenfalls leicht verloren, es sei denn, man verwendet Arrow Functions:

const counter = {
  value: 0,
  increment() {
    setTimeout(function () {
      console.log(this.value); // undefined
    }, 1000);
  }
};

Die innere Funktion hat kein Wissen über counter. this bezieht sich hier auf das globale Objekt (oder ist undefined im Strict Mode).

Lösung mit Arrow Function:

const counter = {
  value: 0,
  increment() {
    setTimeout(() => {
      console.log(this.value); // 0
    }, 1000);
  }
};

Arrow Functions erben this vom umgebenden Scope, in diesem Fall also von der Methode increment(), die korrekt auf counter zeigt.

Methoden in Klassen: Gleiches Prinzip, neue Syntax

Auch in JavaScript-Klassen gilt dasselbe Prinzip: Methoden verlieren ihren Kontext, wenn sie nicht korrekt aufgerufen oder gebunden werden.

class Person {
  constructor(name) {
    this.name = name;
  }

  greet() {
    console.log(`Hallo, ich heiße ${this.name}`);
  }
}

const p = new Person("Lina");
const g = p.greet;
g(); // undefined – `this` zeigt nicht auf `p`

Die erste Lösung: Den this Kontext im Konstruktur der Person Klasse direkt an die Methode “greet” binden.

class Person {
  constructor(name) {
    this.name = name;
    this.greet = this.greet.bind(this);
  }

  greet() {
    console.log(`Hallo, ich heiße ${this.name}`);
  }
}

Die zweite Lösung: Anstelle einer “normalen” Funktion, hier eine Arrow Function nutzen, die den this Skope der Umgebung übernimmt.

class Person {
  name;
  greet = () => {
    console.log(`Hallo, ich heiße ${this.name}`);
  };

  constructor(name) {
    this.name = name;
  }
}

Achtung: Die zweite Variante, mit Arrow Function als Eigenschaft, ist kein Teil der klassischen Prototype-Kette, was in Bezug auf Vererbung und Speicherverbrauch relevant sein kann.

Dynamische Methoden: this mit Object.assign und Co.

Auch dynamisch zugewiesene Methoden verhalten sich erwartungsgemäß, solange sie über das Objekt aufgerufen werden.

const logName = function () {
  console.log(this.name);
};

const userA = { name: "Alea" };
const userB = { name: "Ben" };

userA.sayName = logName;
userB.sayName = logName;

userA.sayName(); // "Alea"
userB.sayName(); // "Ben"

Wird dieselbe Funktion verschiedenen Objekten zugewiesen, verhält sich this korrekt kontextbezogen. Das ist ein echter Vorteil gegenüber statisch gebundenen Sprachen.

Fazit: Methoden und this – kontrollierbare Dynamik

JavaScript-Methoden arbeiten kontextsensitiv. this zeigt dann auf das Objekt, wenn die Methode über das Objekt aufgerufen wird. Wer Methoden als Callback oder Event-Handler weitergibt, muss sich aktiv um das Binden von this kümmern. Das kann, wie in den Beispielen oben gezeigt, über über bind oder die Nutzung von Arrow Functions passieren.

Dieses dynamische Modell ermöglicht extrem flexible Codekonstruktionen, birgt aber ebenso die Gefahr von schwer nachvollziehbaren Fehlern. Ein bewusster Umgang mit dem Kontext ist daher entscheidend für sauberen und stabilen Code.


Buy me a coffee

Wenn Dir meine Beiträge gefallen und sie Dir bei Deiner Arbeit helfen, würde ich mich über einen “Kaffee” und ein paar nette Worte von Dir freuen.

Buy me a coffee



Previous Post
JavaScript verstehen - Methodenbindung mit .bind(), .call() und .apply() richtig einsetzen
Next Post
Das JavaScript-Keyword `this` verstehen - Kontext, Bindung und Stolperfallen