Skip to content

JavaScript verstehen - Methodenbindung mit .bind(), .call() und .apply() richtig einsetzen

Published: at 06:00 AMSuggest Changes

this mit .bind(), .call() und .apply() kontrollieren: Funktionen flexibel binden

JavaScript ist eine flexible Sprache, insbesondere wenn es darum geht, Funktionen losgelöst von ihrem ursprünglichen Kontext zu verwenden. Das hat viele Vorteile, führt aber auch dazu, dass der Bezug zu this verloren gehen kann. Genau hier kommen .bind(), .call() und .apply() ins Spiel.

Mit diesen Methoden kannst du den Kontext, also den Wert von this, explizit setzen. So stellst du sicher, dass deine Funktion immer mit dem gewünschten Objekt arbeitet, unabhängig davon, wie und wann sie aufgerufen wird.

In diesem Beitrag erklären wir die Unterschiede zwischen .bind(), .call() und .apply(), zeigen dir, wann du welche Methode einsetzt, und wie du damit typische this-Fehler elegant vermeidest.

Der Klassiker: Methoden verlieren this außerhalb ihres Objekts

Nehmen wir folgendes Beispiel:

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

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

const sayHi = user.greet;
sayHi(); // undefined – `this` zeigt nicht mehr auf `user`

Hier geht der Methoden-Kontext verloren, weil sayHi() nicht mehr über das Objekt user aufgerufen wird. Die Funktion wird losgelöst verwendet und this zeigt im besten Fall auf das globale Objekt (im schlechtesten auf undefined im Strict Mode).

.bind(): Eine neue Funktion mit festem this

Die Methode .bind() erzeugt eine neue Funktion, bei der this dauerhaft auf ein bestimmtes Objekt gesetzt ist.

const boundGreet = user.greet.bind(user);
boundGreet(); // "Hallo, ich bin Luna"

Das Original bleibt dabei unverändert:

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

Wann nutzen?
Immer dann, wenn du eine Funktion an anderer Stelle weitergeben möchtest (z. B. als Callback oder Event-Handler), aber sicherstellen willst, dass this erhalten bleibt.

Praxisbeispiel:

function Button(label) {
  this.label = label;
  this.click = this.click.bind(this); // bind im Konstruktor
}

Button.prototype.click = function () {
  console.log(`Button "${this.label}" wurde geklickt`);
};

const b = new Button("Senden");
document.querySelector("button").addEventListener("click", b.click);

Ohne bind() wäre this.label im Event-Handler undefined.

.call(): Funktion direkt mit this aufrufen

Mit .call() rufst du die Funktion sofort auf und setzt dabei this manuell.

function sayAge(age) {
  console.log(`${this.name} ist ${age} Jahre alt`);
}

const person = { name: "Milo" };
sayAge.call(person, 28); // "Milo ist 28 Jahre alt"

Syntax:
func.call(thisArg, arg1, arg2, ...)

.call() ist besonders nützlich, wenn du eine Funktion direkt aufrufen und gleichzeitig den Kontext festlegen möchtest.

.apply(): Wie .call(), aber mit Array als Argument

.apply() funktioniert genauso wie .call(), erwartet die Argumente aber in einem Array:

sayAge.apply(person, [32]); // "Milo ist 32 Jahre alt"

Syntax:
func.apply(thisArg, [argsArray])

Das macht .apply() besonders praktisch, wenn man bereits ein Array mit Argumenten hat – z. B. aus arguments oder einer anderen Quelle.

Vergleich: Wann bind, call oder apply?

MethodeFunktion bleibt erhaltenFunktion wird sofort ausgeführtArgumente übergeben
.bind()Direkt oder später
.call()Einzelne Werte
.apply()Als Array

Beispiel: Methodenrecycling durch call()

Ein typisches Anwendungsszenario für .call() ist die Wiederverwendung von Methoden:

const admin = {
  name: "Lina",
  logRole(role) {
    console.log(`${this.name} ist ${role}`);
  }
};

const guest = { name: "Ben" };

admin.logRole.call(guest, "Gast"); // "Ben ist Gast"

Obwohl logRole nicht Teil von guest ist, kann die Methode problemlos mit einem anderen Kontext ausgeführt werden.

Und in Arrow Functions?

Arrow Functions sind nicht kompatibel mit .bind(), .call() oder .apply() – denn sie binden ihr this lexikalisch. Änderungen am Kontext greifen hier nicht.

const arrow = () => {
  console.log(this);
};

arrow.call({ name: "Test" }); // Ignoriert – `this` bleibt window / global object

Deshalb: Verwende bind(), call() und apply() nur bei normalen Funktionen.

Fazit: Methodenbindung meistern heißt this meistern

Die Methoden .bind(), .call() und .apply() sind Werkzeuge, mit denen du this in JavaScript gezielt und kontrolliert einsetzen kannst. Damit vermeidest du typische Fehler wie verlorene Kontexte oder unerwartetes Verhalten bei Callbacks und Event-Handlern.

Wer diese Methoden beherrscht, schreibt robusteren, flexibleren und besser verständlichen Code – gerade in größeren Projekten oder bei dynamischer Funktionsausführung.


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
this im globalen Kontext - Ein unterschätzter Stolperstein
Next Post
JavaScript im Detail - So funktioniert this in Methoden wirklich