Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
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 Juli 2015.
Diecall() Methode vonFunction Instanzen ruft diese Funktion mit einem angegebenenthis-Wert und einzeln bereitgestellten Argumenten auf.
In diesem Artikel
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
thisArgDer Wert, der als
thisbeim Aufruf vonfuncverwendet werden soll. Wenn die Funktion nicht imStrict Mode ist, werdennullundundefineddurch das globale Objekt ersetzt, und primitive Werte werden in Objekte umgewandelt.arg1, …,argNOptionalArgumente für die Funktion.
Rückgabewert
Das Ergebnis des Aufrufs der Funktion mit dem angegebenenthis-Wert und den Argumenten.
Beschreibung
Hinweis:Diese Funktion ist nahezu identisch mitapply(), außer dass beicall() die Funktionsargumente einzeln als Liste übergeben werden, während sie beiapply() in einem Objekt kombiniert werden, typischerweise ein Array — zum Beispiel,func.call(this, "eat", "bananas") vs.func.apply(this, ["eat", "bananas"]).
Normalerweise ist der Wert vonthis innerhalb einer Funktion das Objekt, auf dem die Funktion aufgerufen wurde. Mitcall() kann man beim Aufruf einer bestehenden Funktion einen beliebigen Wert alsthis setzen, ohne die Funktion zuerst als Eigenschaft an das Objekt zu binden. Dies ermöglicht die Nutzung von Methoden eines Objekts als generische Hilfsfunktionen.
Warnung:Verwenden Siecall() nicht, um Konstruktoren zu verketten (zum Beispiel zur Implementierung von Vererbung). Dies ruft die Konstruktorfunktion als normale Funktion auf, was bedeutet, dassnew.targetundefined ist und Klassen einen Fehler werfen, weil sie nicht ohnenew aufgerufen werden können. Verwenden Sie stattdessenReflect.construct() oderextends.
Beispiele
>Verwenden von call(), um eine Funktion aufzurufen und den this-Wert festzulegen
Im folgenden Beispiel wird beim Aufruf vongreet der Wert vonthis an das Objektobj gebunden, auch wenngreet keine Methode vonobj 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 hoursVerwenden von call(), um eine Funktion ohne Angabe des ersten Arguments aufzurufen
Wenn der erstethisArg Parameter weggelassen wird, bleibt er beiundefined. Im Nicht-Strict Mode wird derthis-Wert dann durchglobalThis ersetzt (was dem globalen Objekt ähnlich ist).
globalThis.globProp = "foo";function display() { console.log(`globProp value is ${this.globProp}`);}display.call(); // Logs "globProp value is foo"Im Strict Mode wird der Wert vonthis nicht ersetzt, so dass erundefined bleibt.
"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 undefinedVerwandeln von Methoden in Hilfsfunktionen
call() ist fast gleichbedeutend mit einem normalen Funktionsaufruf, außer dassthis als normales Parameter übergeben wird, anstatt als der Wert, auf dem die Funktion aufgerufen wurde. Dies ist ähnlich wie bei allgemeinen Hilfsfunktionen: anstattarray.map(callback) aufzurufen, verwenden Siemap(array, callback), was Ihnen erlaubt,map mit array-ähnlichen Objekten zu verwenden, die keine Arrays sind (zum Beispielarguments), ohneObject.prototype zu verändern.
Nehmen SieArray.prototype.slice() zum Beispiel, die 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 Sieslice.call nicht speichern und als einfache Funktion aufrufen können, da diecall() Methode auch ihrenthis-Wert ermittelt, der die Funktion ist, die sie aufrufen soll. In diesem Fall können Siebind() verwenden, um den Wert vonthis fürcall() zu binden. Im folgenden Code istslice() eine gebundene Version vonFunction.prototype.call(), wobei der Wert vonthis anArray.prototype.slice() gebunden ist. Das bedeutet, dass zusätzlichecall() Aufrufe beseitigt werden können:
// Same as "slice" in the previous exampleconst unboundSlice = Array.prototype.slice;const slice = Function.prototype.call.bind(unboundSlice);// …slice(arguments);Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function.prototype.call> |