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 angegebenen this-Wert und individuell übergebenen 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-Modus ist, werden null und undefined durch das globale Objekt ersetzt, und primitive Werte werden in Objekte konvertiert.

arg1, …, argN Optional

Argumente für die Funktion.

Rückgabewert

Das Ergebnis der Ausführung der Funktion mit dem spezifizierten this-Wert und den Argumenten.

Beschreibung

Hinweis: Diese Funktion ist nahezu identisch mit apply(), mit dem Unterschied, dass die Funktionsargumente bei call() einzeln als Liste übergeben werden, während sie bei apply() in einem Objekt kombiniert sind, üblicherweise in einem Array — z. B. func.call(this, "eat", "bananas") vs. func.apply(this, ["eat", "bananas"]).

Normalerweise ist bei einem Funktionsaufruf der Wert von this innerhalb der Funktion das Objekt, auf das beim Zugriff auf die Funktion zugegriffen wurde. Mit call() können Sie beim Aufruf einer bestehenden Funktion einen beliebigen Wert als this zuweisen, ohne die Funktion zuerst als Eigenschaft an das Objekt zu binden. Dies ermöglicht es, Methoden eines Objekts als allgemeine Dienstprogrammfunktion zu verwenden.

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

Beispiele

call() benutzen, um eine Funktion aufzurufen und den this-Wert anzugeben

Im folgenden Beispiel wird beim Aufruf von greet der this-Wert an das Objekt obj gebunden, selbst 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

call() benutzen, um eine Funktion aufzurufen, ohne das erste Argument anzugeben

Wenn der erste thisArg-Parameter weggelassen wird, wird er standardmäßig auf undefined gesetzt. Im Non-Strict-Modus wird der this-Wert dann durch globalThis (was dem globalen Objekt entspricht) ersetzt.

js
globalThis.globProp = "Wisen";

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

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

Im Strict-Modus wird der Wert von this nicht ersetzt und bleibt undefined.

js
"use strict";

globalThis.globProp = "Wisen";

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

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

Methoden zu Dienstprogrammfunktionen transformieren

call() ist beinahe identisch mit einem normalen Funktionsaufruf, außer dass this als normaler Parameter übergeben wird, anstatt der Wert zu sein, auf den die Funktion zugegriffen hat. Dies ähnelt der Funktionsweise allgemeiner Dienstprogrammfunktionen: Statt array.map(callback) aufzurufen, verwenden Sie map(array, callback), was es ermöglicht, map mit arrays-ähnlichen Objekten zu verwenden, die keine Arrays sind (z. B. arguments), ohne Object.prototype zu verändern.

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

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 call()-Methode auch ihren this-Wert liest, welcher die Funktion ist, die aufgerufen werden soll. In diesem Fall können Sie bind() verwenden, um den Wert von this für call() zu binden. In dem folgenden Code ist slice() eine gebundene Version von Function.prototype.call(), wobei this an Array.prototype.slice() gebunden ist. Das bedeutet, dass zusätzliche call()-Aufrufe vermieden 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® 2025 Language Specification
# sec-function.prototype.call

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
call

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
See implementation notes.

Siehe auch