| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/apply | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Juli 2015 browserbergreifend verfgbar.
Die apply() Methode von Function Instanzen ruft diese Funktion mit einem gegebenen this-Wert und arguments, die als Array (oder ein array-hnliches Objekt) bereitgestellt werden, auf.
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
apply(thisArg)
apply(thisArg, argsArray)
thisArgDer Wert von this, der fr den Aufruf von func bereitgestellt wird. Wenn die Funktion nicht im strict mode ist, werden null und undefined durch das globale Objekt ersetzt, und primitive Werte werden in Objekte umgewandelt.
argsArray OptionalEin array-hnliches Objekt, das die Argumente angibt, mit denen func aufgerufen werden soll, oder null oder undefined, wenn keine Argumente an die Funktion bergeben werden sollen.
Das Ergebnis des Aufrufs der Funktion mit dem angegebenen this-Wert und den Argumenten.
Hinweis:
Diese Funktion ist fast identisch mit call(), auer dass die Funktionsargumente bei call() einzeln als Liste bergeben werden, whrend sie bei apply() in einem Objekt, typischerweise einem Array, kombiniert sind zum Beispiel func.call(this, "eat", "bananas") vs. func.apply(this, ["eat", "bananas"]).
Normalerweise, wenn eine Funktion aufgerufen wird, ist der Wert von this innerhalb der Funktion das Objekt, auf dem die Funktion aufgerufen wurde. Mit apply() knnen Sie einen beliebigen Wert als this beim Aufrufen einer bestehenden Funktion festlegen, ohne zuerst die Funktion als Eigenschaft an das Objekt anhngen zu mssen. Dies ermglicht es Ihnen, Methoden eines Objekts als generische Utility-Funktionen zu verwenden.
Sie knnen auch jede Art von Objekt, das array-hnlich ist, als zweiten Parameter verwenden. In der Praxis bedeutet das, dass es eine length Eigenschaft und ganze Zahl-Eigenschaften ("Index") im Bereich (0..length - 1) haben muss. Zum Beispiel knnten Sie ein NodeList oder ein benutzerdefiniertes Objekt wie { 'length': 2, '0': 'eat', '1': 'bananas' } verwenden. Sie knnen auch arguments verwenden, zum Beispiel:
function wrapper() {
return anotherFn.apply(null, arguments);
}
Mit den Rest-Parametern 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, auer dass args im ersten Fall mit apply() ein array-hnliches Objekt und im zweiten Fall mit Spread-Syntax ein iterierbares Objekt sein muss.
Warnung:
Verwenden Sie apply() nicht, um Konstruktoren zu verketten (zum Beispiel, um Vererbung zu implementieren). Dies ruft die Konstruktorfunktion als normale Funktion auf, was bedeutet, dass new.target undefined ist, und Klassen einen Fehler werfen, da sie nicht ohne new aufgerufen werden knnen. Verwenden Sie stattdessen Reflect.construct() oder extends.
apply() verwenden, um ein Array an ein anderes anzuhngenSie knnen Array.prototype.push() verwenden, um ein Element an ein Array anzuhngen. Da push() eine variable Anzahl von Argumenten akzeptiert, knnen Sie auch mehrere Elemente auf einmal anhngen. Aber wenn Sie ein Array an push() bergeben, wird dieses Array tatschlich als einzelnes Element hinzugefgt, anstatt die Elemente einzeln hinzuzufgen, was zu einem Array innerhalb eines Arrays fhrt. Andererseits hat Array.prototype.concat() in diesem Fall das gewnschte Verhalten, aber es fgt nicht zum vorhandenen Array hinzu es erstellt und gibt ein neues Array zurck.
In diesem Fall knnen Sie apply verwenden, um ein Array implizit als eine Serie von Argumenten zu "spreaden".
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]
apply() und eingebaute Funktionen verwendenEine clevere Verwendung von apply() ermglicht es Ihnen, eingebaute Funktionen fr einige Aufgaben zu nutzen, die sonst wahrscheinlich ein manuelles Schleifen ber eine Sammlung erfordern wrden (oder die Spread-Syntax verwenden).
Zum Beispiel knnen 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 (const n of numbers) {
if (n > max) {
max = n;
}
if (n < min) {
min = n;
}
}
Aber Vorsicht: Wenn Sie apply() (oder die Spread-Syntax) mit einer beliebig langen Argumentenliste verwenden, laufen Sie Gefahr, das Argumentlngenlimit der JavaScript-Engine zu berschreiten.
Die Konsequenzen eines Funktionsaufrufs mit zu vielen Argumenten (das heit, mehr als zehntausend Argumenten) sind nicht spezifiziert und variieren je nach Engine. (Die JavaScriptCore-Engine hat ein festgelegtes Argumentlimit von 65536.) Die meisten Engines werfen eine Ausnahme; aber es gibt keine normative Spezifikation, die andere Verhaltensweisen verhindert, wie zum Beispiel das willkrliche Begrenzen der tatschlich an die angewendete Funktion bergebenen Argumente. Um diesen letztgenannten Fall zu veranschaulichen: Wenn eine solche Engine ein Limit von vier Argumenten htte (tatschliche Limits sind natrlich erheblich hher), wre es, als ob die Argumente 5, 6, 2, 3 in den obigen Beispielen an apply bergeben worden wren, anstatt des vollstndigen Arrays.
Wenn Ihr Werte-Array auf zehntausende ansteigen knnte, verwenden Sie eine Hybridstrategie: Wenden Sie Ihre Funktion Stck fr Stck 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]);
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-function.prototype.apply |
argumentsFunction.prototype.bind()Function.prototype.call()Reflect.apply()...)FunctionObject/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |