Jungs können jedem erklären, welchen Kontext sie verwenden call
und apply
Methoden in Javascript?
Warum verwenden call
und apply
Anstatt eine Funktion direkt aufzurufen?
Kirsche
Jungs können jedem erklären, welchen Kontext sie verwenden call
und apply
Methoden in Javascript?
Warum verwenden call
und apply
Anstatt eine Funktion direkt aufzurufen?
Kevinji
Sie nutzen call
oder apply
wenn Sie eine andere passieren möchten this
Wert für die Funktion. Im Wesentlichen bedeutet dies, dass Sie eine Funktion ausführen möchten, als wäre sie eine Methode eines bestimmten Objekts. Der einzige Unterschied zwischen den beiden ist das call
erwartet kommagetrennte Parameter, while apply
erwartet Parameter in einem Array.
Ein Beispiel aus Mozillas apply
Seitewobei Konstruktoren verkettet sind:
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0)
throw RangeError('Cannot create product "' + name + '" with a negative price');
return this;
}
function Food(name, price) {
Product.apply(this, arguments);
this.category = 'food';
}
Food.prototype = new Product();
function Toy(name, price) {
Product.apply(this, arguments);
this.category = 'toy';
}
Toy.prototype = new Product();
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
Was Product.apply(this, arguments)
tut ist folgendes: Die Product
Der Konstruktor wird als Funktion in jedem der angewendet Food
und Toy
Konstruktoren, und jede dieser Objektinstanzen wird als übergeben this
. Somit ist jeder von Food
und Toy
jetzt hab this.name
und this.category
Eigenschaften.
Nur eine Frage zum bereitgestellten Code-Snippet, warum wird der Prototyp von Toy und Food durch ein Produktobjekt ersetzt?
– Davids
19. Oktober 2012 um 9:56 Uhr
Kommentieren Sie nur, um @davids Frage zu stoßen: Warum müssen wir tun Toy.prototype = new Product();
? Ich habe dies getestet und das Entfernen dieser Zeilen scheint keinen Unterschied im Endergebnis zu machen.
– adrianp
13. Mai 2013 um 13:49 Uhr
@davids & @adrianp : Es wird benötigt, damit Food und Toy von Product erben. Sehen Sie sich dieses Beispiel an: jsfiddle.net/Shawn/xNEYf Ich entfernte Toy.prototype = new Product();
aber gelassen Food.prototype = new Product();
in, also erbt Food jetzt von Product, aber Toy nicht. Ich habe dem Prototyp von Product auch eine Methode hinzugefügt und sie von Food und Toy aufgerufen, um die fehlende Vererbung deutlicher zu machen (öffnen Sie einfach die Konsole und führen Sie den Code aus, Food kann die von Product geerbte Methode aufrufen, Toy kann dies jedoch nicht und gibt einen Fehler aus). .
– Shawn
17. Juli 2013 um 19:55 Uhr
Wie würde der Prototyp verwendet werden, wenn er mit Objektliteralen verwendet wird?
– Benutzer244394
20. März 2015 um 19:39 Uhr
Ich glaube, ich verstehe einfach nicht den Zweck, dies zu tun, anstatt etwas zu tun, das viel einfacher erscheint, wie z Dies.
– Benutzer4531029
23. Oktober 2016 um 20:50 Uhr
Tigraine
Nur wenn Sie verwenden call
oder apply
Sie können die ändern this
Kontext innerhalb der Funktion.
Im Gegensatz zu anderen Sprachen – in JavaScript this
bezieht sich nicht auf das aktuelle Objekt, sondern auf den Ausführungskontext und kann vom Aufrufer gesetzt werden.
Wenn Sie eine Funktion mit der new
Stichwort this
bezieht sich korrekt auf das neue Objekt (innerhalb der Konstruktorfunktion).
Aber in allen anderen Fällen – this
bezieht sich auf das globale Objekt, es sei denn, es wird explizit durch einen Aufruf festgelegt
Es kann sich auf das aufrufende Objekt beziehen, wenn es verwendet wird obj.whatever();
Syntax.
– Code
17. Juni 2016 um 14:13 Uhr
Die Aussage „Aber in allen anderen Fällen – bezieht sich dies auf das globale Objekt, es sei denn, es wird explizit durch einen Aufruf festgelegt“ sollte wie folgt korrigiert werden: „Aber in allen anderen Fällen, es sei denn, es wird explizit durch einen Aufruf festgelegt, bezieht sich dies auf das globale Objekt, wenn es verwendet wird Ecmascript 3 oder Ecmascript 5 (oder höher) im nicht strikten Modus. In Ecmascript 5 (oder höher) mit striktem Modus ist dies jedoch immer undefiniert, wenn es nicht explizit festgelegt ist, und die JS-Engine löst eine Ausnahme aus, wenn Sie darauf zugreifen. Siehe: stackoverflow.com/questions/9822561/…
– Alan CS
21. Juni 2016 um 19:49 Uhr
Sie nutzen .call()
wenn Sie bewirken möchten, dass eine Funktion mit einem anderen ausgeführt wird this
Wert. Es setzt die this
Wert wie angegeben, setzt die Argumente wie angegeben und ruft dann die Funktion auf. Der Unterschied zwischen .call()
und nur die Ausführung der Funktion ist der Wert der this
Zeiger, wenn die Funktion ausgeführt wird. Wenn Sie die Funktion normal ausführen, entscheidet Javascript, was die this
Zeiger wird sein (normalerweise der globale Kontext window
es sei denn, die Funktion wird als Methode für ein Objekt aufgerufen). Wenn Sie verwenden .call()
geben Sie genau an, was Sie wollen this
eingestellt werden.
Sie nutzen .apply()
wenn sich die Argumente, die Sie an eine Funktion übergeben möchten, in einem Array befinden. .apply()
kann auch bewirken, dass eine Funktion mit einem bestimmten ausgeführt wird this
Wert. .apply()
wird am häufigsten verwendet, wenn Sie eine unbestimmte Anzahl von Argumenten haben, die aus einer anderen Quelle stammen. Es wird oft verwendet, um die Argumente von einem Funktionsaufruf an einen anderen zu übergeben, indem die spezielle lokale Variable verwendet wird arguments
die ein Array von Argumenten enthält, die an Ihre aktuelle Funktion übergeben wurden.
Ich finde die MDN-Referenzseiten für .Anruf() und .anwenden() hilfreich.
Danke, du erklärst es sehr gut. Verstehen Sie schließlich die Verwendung des ersten Arguments.
– Fragenüberlauf
21. Juli 2012 um 13:50 Uhr
Ivo
Wenn Sie Erfahrung mit jQuery haben, wissen Sie, dass die meisten Funktionen die verwenden this
Objekt. Zum Beispiel, collection.each(function() { ... });
Innerhalb dieser Funktion "this"
bezieht sich auf das Iterator-Objekt. Dies ist eine mögliche Verwendung.
Ich persönlich habe verwendet .apply()
zum Implementieren einer Warteschlange von Anforderungen – Ich schiebe ein Array von Argumenten in die Warteschlange, und wenn die Zeit für die Ausführung gekommen ist, nehme ich ein Element und übergebe es als Argumente für eine Handler-Funktion using .apply()
, wodurch der Code sauberer wird, wenn als erstes Argument ein Array von Argumenten übergeben werden muss. Das ist ein weiteres Beispiel.
Denken Sie im Allgemeinen daran, dass es diese Möglichkeiten gibt, eine Funktion aufzurufen, und dass Sie sie eines Tages für die Implementierung Ihres Programms bequem finden werden.
Wenn Sie Erfahrung mit haben Object Oriented Programming
dann ist call and apply sinnvoll, wenn Sie es mit der Vererbung vergleichen und die Eigenschaften oder Methoden/Funktionen der übergeordneten Klasse von der untergeordneten Klasse überschreiben. Das ist ähnlich wie bei Call in Javascript wie folgt:
function foo () {
this.helloworld = "hello from foo"
}
foo.prototype.print = function () {
console.log(this.helloworld)
}
foo.prototype.main = function () {
this.print()
}
function bar() {
this.helloworld = 'hello from bar'
}
// declaring print function to override the previous print
bar.prototype.print = function () {
console.log(this.helloworld)
}
var iamfoo = new foo()
iamfoo.main() // prints: hello from foo
iamfoo.main.call(new bar()) // override print and prints: hello from bar
Daniel Coffmann
Ich kann mir keine normale Situation vorstellen, in der das Setzen von thisArg auf etwas anderes der Zweck der Verwendung von apply ist.
Der Zweck von apply besteht darin, ein Array von Werten an eine Funktion zu übergeben, die diese Werte als Argumente haben möchte.
Es wurde im gesamten normalen Alltagsgebrauch durch den Spread-Betreiber ersetzt.
z.B
// Finding the largest number in an array
`Math.max.apply(null, arr)` becomes `Math.max(...arr)`
// Inserting the values of one array at the start of another
Array.prototype.unshift.apply(arr1, arr2);
// which becomes
arr1 = [...arr2, ...arr1]
Dies lesen hat mir geholfen, den Sinn zu verstehen
thisArg
beim Anrufenapply()
undcall()
das scheint der Kern Ihrer Frage zu sein. Sie müssen Funktionsaufrufprimitive in Javascript verstehen– Saba Ahang
26. Oktober 2015 um 20:54 Uhr