Function.prototype.apply()
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 apply()
-Methode von Function
-Instanzen ruft diese Funktion mit einem angegebenen this
-Wert und arguments
, die als Array (oder ein Array-ähnliches Objekt) bereitgestellt werden, auf.
Probieren Sie es aus
const numbers = [5, 6, 2, 3, 7];
const max = Math.max.apply(null, numbers);
console.log(max);
// Expected output: 7
const min = Math.min.apply(null, numbers);
console.log(min);
// Expected output: 2
Syntax
apply(thisArg)
apply(thisArg, argsArray)
Parameter
thisArg
-
Der Wert von
this
, der für den Aufruf vonfunc
bereitgestellt wird. Befindet sich die Funktion nicht im Strict-Modus, werdennull
undundefined
durch das globale Objekt ersetzt, und primitive Werte werden in Objekte umgewandelt. argsArray
Optional-
Ein Array-ähnliches Objekt, das die Argumente angibt, mit denen
func
aufgerufen werden soll, odernull
beziehungsweiseundefined
, wenn keine Argumente an die Funktion übergeben werden sollen.
Rückgabewert
Das Ergebnis des Aufrufs der Funktion mit dem angegebenen this
-Wert und den Argumenten.
Beschreibung
Hinweis:
Diese Funktion ist fast identisch mit call()
, mit der Ausnahme, dass die Funktionsargumente bei 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 dieser Funktion das Objekt, auf dem die Funktion aufgerufen wurde. Mit apply()
können Sie beim Aufrufen einer bestehenden Funktion einen beliebigen Wert als this
zuweisen, ohne die Funktion zuerst als Eigenschaft an ein Objekt anfügen zu müssen. Dadurch können Sie Methoden eines Objekts als generische Utility-Funktionen verwenden.
Sie können auch jedes Array-ähnliche Objekt als zweiten Parameter verwenden. Praktisch bedeutet das, dass das Objekt eine Eigenschaft length
und ganzzahlige ("Index")-Eigenschaften im Bereich (0..length - 1)
besitzen muss. Beispielsweise können Sie ein NodeList
oder ein benutzerdefiniertes Objekt wie { 'length': 2, '0': 'eat', '1': 'bananas' }
verwenden. Sie können auch arguments
verwenden, zum Beispiel:
function wrapper() {
return anotherFn.apply(null, arguments);
}
Mit den Rest-Parametern und der Parameter-Spread-Syntax kann dies neu formuliert werden als:
function wrapper(...args) {
return anotherFn(...args);
}
Im Allgemeinen entspricht fn.apply(null, args)
dem Aufruf fn(...args)
mit der Spread-Syntax der Parameter, mit dem Unterschied, dass args
bei der Verwendung mit apply()
ein Array-ähnliches Objekt sein muss und bei der Spread-Syntax ein iterierbares Objekt erwartet wird.
Warnung:
Verwenden Sie apply()
nicht, um Konstruktoren zu verketteten (z. B. um Vererbung zu implementieren). Dies ruft die Konstruktorfunktion als normale Funktion auf, was bedeutet, dass new.target
undefined
ist, und Klassen geben einen Fehler aus, da sie nicht ohne new
aufgerufen werden können. Verwenden Sie stattdessen Reflect.construct()
oder extends
.
Beispiele
Verwendung von apply(), um ein Array an ein anderes anzuhängen
Sie können Array.prototype.push()
verwenden, um ein Element an ein Array anzuhängen. Da push()
eine variable Anzahl von Argumenten akzeptiert, können Sie auch mehrere Elemente gleichzeitig anhängen. Wenn Sie jedoch ein Array an push()
übergeben, wird dieses tatsächlich als einzelnes Element hinzugefügt, anstatt die Elemente einzeln hinzuzufügen, was dazu führt, dass sich ein Array innerhalb eines Arrays befindet. Andererseits hat Array.prototype.concat()
in diesem Fall das gewünschte Verhalten, fügt jedoch nicht zu einem bestehenden Array hinzu – es erstellt und gibt ein neues Array zurück.
In diesem Fall können Sie apply
verwenden, um ein Array implizit als Serie von Argumenten "zu spreizen".
const array = ["a", "b"];
const elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
Der gleiche Effekt kann mit der Spread-Syntax erreicht werden.
const array = ["a", "b"];
const elements = [0, 1, 2];
array.push(...elements);
console.info(array); // ["a", "b", 0, 1, 2]
Verwendung von apply() und eingebauten Funktionen
Ein cleverer Einsatz von apply()
ermöglicht es Ihnen, eingebaute Funktionen für Aufgaben zu nutzen, die ansonsten möglicherweise das manuelle Durchlaufen einer Sammlung (oder die Nutzung der Spread-Syntax) erfordern würden.
Zum Beispiel können wir Math.max()
und Math.min()
verwenden, um den maximalen und minimalen Wert in einem Array zu ermitteln.
// min/max number in an array
const numbers = [5, 6, 2, 3, 7];
// using Math.min/Math.max apply
let max = Math.max.apply(null, numbers);
// This about equal to Math.max(numbers[0], …)
// or Math.max(5, 6, …)
let min = Math.min.apply(null, numbers);
// vs. loop based algorithm
max = -Infinity;
min = +Infinity;
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
Aber Vorsicht: Durch die Verwendung von apply()
(oder der Spread-Syntax) mit einer willkürlich langen Argumentliste riskieren Sie, die Argumentlängenbegrenzung der JavaScript-Engine zu überschreiten.
Die Folgen des Aufrufs einer Funktion mit zu vielen Argumenten (d. h. mehr als zehntausend Argumente) sind nicht spezifiziert und variieren je nach Engine. (Die JavaScriptCore-Engine hat eine festgelegte Argumentbegrenzung von 65536.) Die meisten Engines werfen eine Ausnahme; es gibt jedoch keine normative Spezifikation, die andere Verhaltensweisen ausschließt, wie z. B. die willkürliche Begrenzung der tatsächlich an die angewandte Funktion übergebenen Argumente. Um diesen Fall zu verdeutlichen: Wenn eine solche Engine ein Argumentlimit von vier hätte (tatsächliche Limits sind natürlich deutlich höher), wäre es so, als ob die Argumente 5, 6, 2, 3
in den obigen Beispielen an apply
übergeben worden wären, anstelle des vollständigen Arrays.
Wenn Ihr Werte-Array auf zehntausende Einträge anwachsen könnte, verwenden Sie eine hybride Strategie: Wenden Sie die Funktion in Teilabschnitten des Arrays an:
function minOfArray(arr) {
let min = Infinity;
const QUANTUM = 32768;
for (let i = 0; i < arr.length; i += QUANTUM) {
const subMin = Math.min.apply(
null,
arr.slice(i, Math.min(i + QUANTUM, arr.length)),
);
min = Math.min(subMin, min);
}
return min;
}
const min = minOfArray([5, 6, 2, 3, 7]);
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-function.prototype.apply |
Browser-Kompatibilität
Report problems with this compatibility data on GitHubdesktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
apply | ||||||||||||||
ES 5.1: generic array-like object as arguments |
Legend
Tip: you can click/tap on a cell for more information.
- Full support
- Full support