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

js
apply(thisArg)
apply(thisArg, argsArray)

Parameter

thisArg

Der Wert von this, der für den Aufruf von func bereitgestellt wird. Befindet sich die Funktion nicht im Strict-Modus, werden null und undefined 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, oder null beziehungsweise undefined, 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:

js
function wrapper() {
  return anotherFn.apply(null, arguments);
}

Mit den Rest-Parametern und der Parameter-Spread-Syntax kann dies neu formuliert werden als:

js
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".

js
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.

js
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.

js
// 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:

js
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 GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
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

Siehe auch