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
call(thisArg)
call(thisArg, arg1)
call(thisArg, arg1, arg2)
call(thisArg, arg1, arg2, /* …, */ argN)
Parameter
thisArg
-
Der Wert, der als
this
verwendet wird, wennfunc
aufgerufen wird. Wenn die Funktion nicht im Strict-Modus ist, werdennull
undundefined
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.
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.
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
.
"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:
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:
// 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 GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
call |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support
- See implementation notes.