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?
| Methode | Funktion bleibt erhalten | Funktion wird sofort ausgeführt | Argumente ü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.
- Nutze
.bind(), wenn du eine Funktion weiterreichen, aber den Kontext fixieren willst. - Greife zu
.call(), wenn du eine Funktion sofort mit einem bestimmtenthisaufrufen willst. - Verwende
.apply(), wenn deine Argumente in einem Array vorliegen.
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.