Baseline Widely available
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
Syntax
apply(thisArg)
apply(thisArg, argsArray)
Parameter
thisArg
Der Wert von this
, der für 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
Optional
Ein 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()
, auÃer dass die Funktionsargumente bei call()
einzeln als Liste übergeben werden, während 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()
können Sie einen beliebigen Wert als this
beim Aufrufen einer bestehenden Funktion festlegen, ohne zuerst die Funktion als Eigenschaft an das Objekt anhängen zu müssen. Dies ermöglicht es Ihnen, Methoden eines Objekts als generische Utility-Funktionen zu verwenden.
Sie können 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 könnten 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 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
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 können. Verwenden Sie stattdessen Reflect.construct()
oder extends
.
apply()
verwenden, 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 auf einmal anhängen. Aber wenn Sie ein Array an push()
übergeben, wird dieses Array tatsächlich als einzelnes Element hinzugefügt, anstatt die Elemente einzeln hinzuzufügen, was zu einem Array innerhalb eines Arrays führt. Andererseits hat Array.prototype.concat()
in diesem Fall das gewünschte Verhalten, aber es fügt nicht zum vorhandenen Array hinzu â 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 "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 verwenden
Eine clevere Verwendung von apply()
ermöglicht es Ihnen, eingebaute Funktionen für einige Aufgaben zu nutzen, die sonst wahrscheinlich ein manuelles Schleifen über eine Sammlung erfordern würden (oder die Spread-Syntax verwenden).
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 (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 Argumentlängenlimit der JavaScript-Engine zu überschreiten.
Die Konsequenzen eines Funktionsaufrufs mit zu vielen Argumenten (das heiÃt, 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 willkürliche Begrenzen der tatsächlich an die angewendete 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 erheblich höher), wäre es, als ob die Argumente 5, 6, 2, 3
in den obigen Beispielen an apply
übergeben worden wären, anstatt des vollständigen Arrays.
Wenn Ihr Werte-Array auf zehntausende ansteigen könnte, verwenden Sie eine Hybridstrategie: Wenden Sie Ihre Funktion Stück für Stück 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 Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4