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

js
apply(thisArg)
apply(thisArg, argsArray)

Parameter

thisArg

Der Wert von this, der für den Aufruf von func bereitgestellt wird. Wenn sich die Funktion nicht im Strict Mode befindet, 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 spezifiziert, mit denen func aufgerufen werden soll, oder null oder 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(), 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:

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

Mit den Restparametern und dem Parameter Spread-Syntax kann dies umgeschrieben werden als:

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

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

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.

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 (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:

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® 2026 Language Specification
# sec-function.prototype.apply

Browser-Kompatibilität

Siehe auch