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 gegebenen this
Wert auf, wobei arguments
als Array (oder ein array-ähnliches Objekt) bereitgestellt werden.
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. Wenn sich die Funktion nicht im Strict Mode befindet, werdennull
undundefined
durch das globale Objekt ersetzt, und primitive Werte werden in Objekte umgewandelt. argsArray
Optional-
Ein array-ähnliches Objekt, das die Argumente spezifiziert, mit denen
func
aufgerufen werden soll, odernull
oderundefined
, 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()
, außer dass die Funktionsargumente an call()
einzeln als Liste übergeben werden, während sie für apply()
in einem Objekt kombiniert werden, typischerweise einem Array — 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 apply()
können Sie einen beliebigen Wert als this
beim Aufruf einer bestehenden Funktion zuweisen, ohne die Funktion zuerst als Eigenschaft an das Objekt zu binden. Dies ermöglicht es, Methoden eines Objekts als generische Hilfsfunktionen zu verwenden.
Sie können auch jede Art von Objekt verwenden, das array-ähnlich ist, als zweiten Parameter. In der Praxis bedeutet dies, dass es eine length
Eigenschaft und ganze ("index") Eigenschaften im Bereich (0..length - 1)
haben muss. Zum Beispiel könnten Sie ein NodeList
verwenden oder ein benutzerdefiniertes Objekt wie { 'length': 2, '0': 'eat', '1': 'bananas' }
. Sie können auch arguments
verwenden, zum Beispiel:
function wrapper() {
return anotherFn.apply(null, arguments);
}
Mit den Restparametern und dem Parameter Spread-Syntax kann dies umgeschrieben werden als:
function wrapper(...args) {
return anotherFn(...args);
}
Im Allgemeinen ist fn.apply(null, args)
äquivalent zu fn(...args)
mit der Parameter-Spread-Syntax, außer dass args
erwartet wird, ein array-ähnliches Objekt im ersten Fall mit apply()
zu sein, und ein iterierbares Objekt im letzteren Fall mit Spread-Syntax.
Warnung:
Verwenden Sie apply()
nicht, um Konstruktoren zu verketten (zum Beispiel zur Implementierung von Vererbung). Dies ruft die Konstrukturfunktion als normale Funktion auf, was bedeutet, dass new.target
undefined
ist, und Klassen einen Fehler werfen, da sie nicht ohne new
aufgerufen werden können. Verwenden Sie stattdessen Reflect.construct()
oder extends
.
Beispiele
Anwendung von apply(), um ein Array zu einem anderen hinzuzufügen
Sie können Array.prototype.push()
verwenden, um ein Element zu einem Array hinzuzufügen. Da push()
eine variable Anzahl von Argumenten akzeptiert, können Sie auch mehrere Elemente auf einmal hinzufügen. Aber wenn Sie ein Array an push()
übergeben, wird dieses Array tatsächlich als einzelnes Element hinzugefügt, anstatt die Elemente individuell hinzuzufügen, und Sie enden mit einem Array in einem Array. Andererseits hat Array.prototype.concat()
in diesem Fall das gewünschte Verhalten, fügt aber nicht an das bestehende Array an — es erstellt und gibt ein neues Array zurück.
In diesem Fall können Sie apply
verwenden, um ein Array implizit als eine Serie von Argumenten zu "verteilen".
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
Eine geschickte Nutzung von apply()
ermöglicht es Ihnen, eingebaute Funktionen für einige Aufgaben zu verwenden, die vermutlich ansonsten manuelles Durchlaufen einer Sammlung (oder die 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 herauszufinden.
// 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 (const n of numbers) {
if (n > max) {
max = n;
}
if (n < min) {
min = n;
}
}
Aber Vorsicht: bei der Verwendung von apply()
(oder der Spread-Syntax) mit einer willkürlich langen Argumentliste läuft man Gefahr, das Argumentlängenlimit der JavaScript-Engine zu überschreiten.
Die Konsequenzen des Aufrufs einer Funktion mit zu vielen Argumenten (das heißt, mehr als Zehntausende von Argumenten) sind nicht spezifiziert und variieren zwischen den Engines. (Die JavaScriptCore-Engine hat ein fest codiertes Argumentlimit von 65536.) Die meisten Engines werfen eine Ausnahme; aber es gibt keine normative Spezifikation, die andere Verhaltensweisen verhindert, wie zum Beispiel eine willkürliche Begrenzung der tatsächlich an die angewandte Funktion übergebenen Argumente. Um diesen letztgenannten Fall zu veranschaulichen: Wenn eine solche Engine ein Limit von vier Argumenten 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, statt des gesamten Arrays.
Wenn Ihr Array in die Zehntausende anwachsen könnte, verwenden Sie eine hybride Strategie: Wenden Sie Ihre Funktion in Teilen auf das Array 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® 2026 Language Specification # sec-function.prototype.apply |