Function.prototype.call()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die call()-Methode von Function-Instanzen ruft diese Funktion mit einem gegebenen this-Wert und individuell bereitgestellten Argumenten auf.

Probieren Sie es aus

function Product(name, price) {
  this.name = name;
  this.price = price;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = "food";
}

console.log(new Food("cheese", 5).name);
// Expected output: "cheese"

Syntax

js
call(thisArg)
call(thisArg, arg1)
call(thisArg, arg1, arg2)
call(thisArg, arg1, arg2, /* …, */ argN)

Parameter

thisArg

Der Wert, der als this verwendet wird, wenn func aufgerufen wird. Wenn die Funktion nicht im Strict Mode ist, werden null und undefined durch das globale Objekt ersetzt, und primitive Werte werden in Objekte umgewandelt.

arg1, …, argN Optional

Argumente für die Funktion.

Rückgabewert

Das Ergebnis des Aufrufs der Funktion mit dem angegebenen this-Wert und den Argumenten.

Beschreibung

Hinweis: Diese Funktion ist fast identisch mit apply(), außer dass die Funktionsargumente bei call() einzeln als Liste übergeben werden, während sie bei apply() in einem Objekt, typischerweise in einem Array, kombiniert sind — zum Beispiel func.call(this, "eat", "bananas") vs. func.apply(this, ["eat", "bananas"]).

Normalerweise ist beim Funktionsaufruf der Wert von this innerhalb der Funktion das Objekt, auf dem die Funktion aufgerufen wurde. Mit call() können Sie einen beliebigen Wert als this zuweisen, wenn Sie eine vorhandene Funktion aufrufen, ohne die Funktion zuerst dem Objekt als Eigenschaft anzuhängen. Dies ermöglicht die Verwendung von Methoden eines Objekts als allgemeine Dienstprogrammfunktionen.

Warnung: Verwenden Sie call() nicht, um Konstruktoren zu verketten (zum Beispiel, um Vererbung zu implementieren). Dies ruft die Konstruktorfunktion als normale Funktion auf, was bedeutet, dass new.target undefined ist und Klassen einen Fehler werfen, da sie nicht ohne new aufgerufen werden können. Verwenden Sie stattdessen Reflect.construct() oder extends.

Beispiele

Verwenden von call() zum Aufrufen einer Funktion und Festlegen des this-Wertes

Im folgenden Beispiel wird beim Aufruf von greet der Wert von this an das Objekt obj gebunden, auch wenn greet keine Methode von obj ist.

js
function greet() {
  console.log(this.animal, "typically sleep between", this.sleepDuration);
}

const obj = {
  animal: "cats",
  sleepDuration: "12 and 16 hours",
};

greet.call(obj); // cats typically sleep between 12 and 16 hours

Verwenden von call() zum Aufrufen einer Funktion ohne Angabe des ersten Arguments

Wenn der erste thisArg-Parameter weggelassen wird, ist der Standardwert undefined. Im Nicht-Strikt-Modus wird der this-Wert dann durch globalThis (entspricht dem globalen Objekt) ersetzt.

js
globalThis.globProp = "foo";

function display() {
  console.log(`globProp value is ${this.globProp}`);
}

display.call(); // Logs "globProp value is foo"

Im Strikten Modus wird der Wert von this nicht ersetzt, sodass er als undefined bleibt.

js
"use strict";

globalThis.globProp = "foo";

function display() {
  console.log(`globProp value is ${this.globProp}`);
}

display.call(); // throws TypeError: Cannot read the property of 'globProp' of undefined

Methoden in Dienstprogrammfunktionen umwandeln

call() ist fast gleichbedeutend mit einem normalen Funktionsaufruf, außer dass this als normales Parameter anstelle des Wertes übergeben wird, auf dem die Funktion aufgerufen wurde. Dies ähnelt der Funktionsweise von allgemeinen Dienstprogrammfunktionen: anstatt array.map(callback) aufzurufen, verwendet man map(array, callback), was die Nutzung von map mit array-ähnlichen Objekten ermöglicht, die keine Arrays sind (zum Beispiel arguments), ohne Object.prototype zu verändern.

Nehmen wir Array.prototype.slice() als Beispiel, das Sie verwenden möchten, um ein array-ähnliches Objekt in ein echtes Array zu konvertieren. Sie könnten eine Abkürzung so erstellen:

js
const slice = Array.prototype.slice;

// …

slice.call(arguments);

Beachten Sie, dass Sie slice.call nicht speichern und als normale Funktion aufrufen können, da die Methode call() auch ihren this-Wert liest, der die Funktion ist, die sie aufrufen soll. In diesem Fall können Sie bind() verwenden, um den Wert von this für call() zu binden. Im folgenden Code ist slice() eine gebundene Version von Function.prototype.call(), wobei der this-Wert an Array.prototype.slice() gebunden ist. Dies bedeutet, dass zusätzliche call()-Aufrufe eliminiert werden können:

js
// Same as "slice" in the previous example
const unboundSlice = Array.prototype.slice;
const slice = Function.prototype.call.bind(unboundSlice);

// …

slice(arguments);

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-function.prototype.call

Browser-Kompatibilität

Siehe auch