Kontext zum Aufrufen und Bewerben in Javascript?

Lesezeit: 6 Minuten

Benutzer-Avatar
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?

  • Dies lesen hat mir geholfen, den Sinn zu verstehen thisArg beim Anrufen apply() und call() das scheint der Kern Ihrer Frage zu sein. Sie müssen Funktionsaufrufprimitive in Javascript verstehen

    – Saba Ahang

    26. Oktober 2015 um 20:54 Uhr


Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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]

1093490cookie-checkKontext zum Aufrufen und Bewerben in Javascript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy