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 einzeln angegebenen 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
beim Aufruf vonfunc
verwendet wird. Wenn die Funktion nicht im Strict-Modus ist, werdennull
undundefined
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 nahezu identisch mit apply()
, außer dass die Funktionsargumente an call()
einzeln als Liste übergeben werden, während sie bei apply()
in einem Objekt, typischerweise einem Array, kombiniert werden — zum Beispiel, func.call(this, "eat", "bananas")
vs. func.apply(this, ["eat", "bananas"])
.
Normalerweise ist beim Aufruf einer Funktion der Wert von this
innerhalb der Funktion das Objekt, auf dem die Funktion aufgerufen 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 anzubinden. Dies erlaubt es, Methoden eines Objekts als allgemeine Dienstprogrammfunktionen zu verwenden.
Warnung:
Verwenden Sie call()
nicht, um Konstruktoren zu verkette (zum Beispiel zur Implementierung von Vererbung). Dies führt dazu, dass die Konstruktorfunktion als normale Funktion aufgerufen wird, was bedeutet, dass new.target
undefined
ist, und Klassen werfen einen Fehler, weil sie nicht ohne new
aufgerufen werden können. Verwenden Sie stattdessen Reflect.construct()
oder extends
.
Beispiele
Verwendung von call(), um eine Funktion aufzurufen und den this-Wert zu spezifizieren
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.
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
Verwendung von call(), um eine Funktion aufzurufen, ohne das erste Argument anzugeben
Wenn der erste Parameter thisArg
weggelassen wird, wird er standardmäßig auf undefined
gesetzt. Im Nicht-Strict-Modus wird der this
-Wert dann durch globalThis
(was dem globalen Objekt ähnlich ist) 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, sodass er undefined
bleibt.
"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 in Dienstprogramme umwandeln
call()
ist fast gleichbedeutend mit einem normalen Funktionsaufruf, außer dass this
als normales Parameter übergeben wird, anstatt als Wert, auf dem die Funktion aufgerufen wurde. Dies ähnelt der Arbeitsweise von allgemeinen Dienstprogrammfunktionen: Anstatt array.map(callback)
aufzurufen, verwenden Sie map(array, callback)
, was es ermöglicht, map
mit array-ähnlichen Objekten zu verwenden, die keine Arrays sind (zum Beispiel arguments
), ohne Object.prototype
zu verändern.
Nehmen Sie zum Beispiel Array.prototype.slice()
, das Sie verwenden möchten, um ein array-ähnliches Objekt in ein echtes Array zu konvertieren. Sie könnten eine Abkürzung wie diese erstellen:
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, 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 Codebeispiel 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:
// 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
BCD tables only load in the browser