Wenn Sie noch nie dynamischen Sprachen ausgesetzt waren und JavaScript in einer kompilierten Sprachmindset verstehen, werden Sie ein magisches und seltsames Gefühl haben, weil Dinge, die im Bewusstsein oft unmöglich sind, passieren und sich sogar unangemessen fühlen. Wenn Sie dieses Gefühl beim Lernen von JavaScript, einer freien und endlosen Sprache, begegnen, dann lassen Sie sich aus der vorliegenden Form Ihren "Vorurteilen" los, da dies definitiv eine neue Welt für Sie ist, lassen Sie JavaScript das vorherige Verfestigungsbewusstsein langsam schmelzen und neue Vitalität injizieren!
OK, gehen wir wieder auf den Punkt, verstehen Sie zunächst die Kontexteigenschaften von Javascrtipt dynamisch transformierte Laufzeit. Dieses Merkmal spiegelt sich hauptsächlich in der Anwendung der beiden Antragsmethoden und Anrufe wider.
Um zu unterscheiden, wenden Sie sich an einen Satz,
foo.call (this, arg1, arg2, arg3) == foo.apply (this, argumente) == this.foo (arg1, arg2, arg3)
Aufrufen und anwenden gehören zu einer Funktionsmethode.Prototype. Es wird von der JavaScript -Engine intrinsisch implementiert. Da es zur Funktion gehört. Da es sich um eine Eigenschaft einer Methode handelt, richtet sich ihre Verwendung natürlich auf die Methode. Diese beiden Methoden sind leicht zu verwechseln, da sie die gleiche Funktion haben, aber unterschiedlich verwendet werden.
Ähnlichkeiten: Die Auswirkungen der beiden Methoden sind genau gleich
Unterschiede: Die von der Methode übergebenen Parameter sind unterschiedlich
Wie wirkt sich die Methode aus und welche Parameter haben die Methode übergeben?
Lassen Sie uns den oben genannten Foo.call analysieren (dies, arg1, arg2, arg3).
Foo ist eine Methode, dies ist ein kontextbezogenes Objekt, wenn die Methode ausgeführt wird, arg1, arg2 und arg3 sind Parameter, die an die FOO-Methode übergeben werden. Das sogenannte kontextbezogene Objekt, wenn die Methode ausgeführt wird, wenn es eine objektorientierte Programmierbasis gibt, ist es leicht zu verstehen, dass dies im Objekt nach der Unterrichtsfindung ist.
In JavaScript verfügt der Code immer über ein Kontextobjekt, und der Code verarbeitet ihn innerhalb. Das Kontextobjekt wird durch diese Variable verkörpert, die immer auf das Objekt zeigt, in dem sich der aktuelle Code befindet.
Um besser zu verstehen, was das ist, geben Sie ein Beispiel.
/Erstellen Sie eine Klasse A -Funktion a () {// Der folgende Code wird ausgeführt, wenn die Klasse so instanziiert ist. this.getMessage = function () {<span style = "White-Space: pre"> </span> return this.message; <span style = "White-Space: pre"> </span>}} // Erstellen Sie eine Klasse ein Instanzobjekt var a = new a (); // Kalendat-Ein-Instanz-Objekt-Objekt var a = new a (); // Calendate a calendate-Instanz-Wert-Wert-Wert. alert (a.getMessage ()); // Erstellen Sie eine Klasse B -Funktion b () {this.message = "Nachricht von B"; this.setMessage = function (msg) {<span style = "White-Space: pre"> </span> this.message = msg; <span style = "White-Space: pre"> </span>}} // Erstellen Sie eine Klasse-B-Instanzobjekt var a = new B ();Es ist zu sehen, dass die Klassen A und B ein Nachrichtenattribut haben (zu den im Objekt erwähnten Mitgliedern). A verfügt über eine GetMessage -Methode, um Nachrichten zu erhalten, und B verfügt über eine SetMessage -Methode zum Festlegen von Nachrichten. Das Folgende ist, die Kraft des Anrufs anzuzeigen.
// Dynamic zuweisen eine SetMessage -Methode von B an Objekt a. Beachten Sie, dass A selbst diese Methode nicht hat! B.SetMessage.call (a, "As Nachricht"); // Alle Anzeigen "A's Message" -Alert (a.getMessage ()); // Dynamic eine GetMessage -Methode von A to Objekt zuweisen b. Beachten Sie, dass B selbst diese Methode nicht hat!
Dies ist die Kraft des Dynamic Language JavaScript -Anrufs!
Es ist einfach "etwas aus dem Nichts heraus zu erschaffen". Die Methoden des Objekts können willkürlich zugewiesen werden, aber das Objekt selbst hat diese Methode noch nie. Beachten Sie, dass es sich um eine Zuordnung handelt. In Laiendaten besteht die Methode darin, ein anderes Objekt zu verleihen, um die Aufgabe zu erledigen. Grundsätzlich ändert sich das Kontextobjekt, wenn die Methode ausgeführt wird.
Daher b.setMessage.call (a, "a message"); ist gleichbedeutend mit der Verwendung von A als Kontextobjekt, um die SetMessage -Methode des B -Objekts bei der Ausführung aufzurufen, und dieser Prozess hat keine Beziehung zu B, und sein Effekt entspricht A.SetMessage ("A -Nachricht").
Da die Auswirkung von Anwendung und Anruf gleich ist, kann es sagen, dass dies gesagt werden kann, dass
Anruf, anwenden Sie die Funktion an, die Methoden anderer Personen ausleihen, um sie anzurufen, genau wie das Aufrufen der eigenen.
OK, nach dem Verständnis der Ähnlichkeiten zwischen Anruf und Bewerbung. Nachdem wir sie verstanden haben, schauen wir uns ihre Unterschiede an. Nachdem Sie sich die obigen Beispiele angesehen haben, glaube ich, dass Sie davon wissen.
Von B.SetMessage.call (a, "As Nachricht") entspricht A.SetMessage ("As Nachricht"), es ist zu erkennen, dass "As Nachricht" als Parameter im Anruf übergeben wird.
Wie bedeutet es also, zu bewerben? Es ist schwer, es klar zu erklären. Der Antrag muss mit den Anwendungsszenarien kombiniert werden, um auf einen Blick klar zu sein. Entwerfen wir ein Anwendungsszenario:
Funktionsdruck (a, b, c, d) {alert (a + b + c + d); print.apply (this, argumente); // oder in ein Array print.apply (this, [a, b, c, d]);} // Das "Backlit -Skript" Beispiel ("zurück", "Licht", "Fuß", "dieses");In diesem Szenario wird in der Beispielmethode A, B, C, D als Parameter verwendet, die von der Methode übergeben wurden, und die Methoden verwenden Anwenden und Anruf, um die Druckmethode zum Aufrufen auszuleihen.
Da die Beispielmethode direkt aufgerufen wird, ist das Kontextobjekt in dieser Methode ein Fensterobjekt.
Daher ist mit Ausnahme des ersten Parameters, dh das Kontextobjekt, bei der Ausführung gleich. Die anderen Parameter der Aufrufmethode werden als Parameter wiederum an die geliehene Methode übergeben, während angewendet zwei Parameter und der zweite Parameter in einem Array übergeben werden. Es kann also gesagt werden
Die Differenz zwischen Anruf- und Anwendungsmethoden besteht darin, dass aus dem zweiten Parameter die Parameter für die Anrufmethode an die geliehene Methode als Parameter übergeben werden, während das Anwendung diese Parameter direkt in ein Array einbringt und dann übergibt. Schließlich ist die Parameterliste der geliehenen Methode gleich.
Anwendungsszenarien:
Der Anruf ist verfügbar, wenn die Parameter klar sind, und anwenden Argumenten können verwendet werden, wenn die Parameter unklar sind.
// Beispiel print.call (Fenster, "zurück", "Licht", "Fuß", "this"); // Foo-Parameter können mehrere Funktionen sein.
Der obige Artikel versteht den Unterschied zwischen apply () und call () in JavaScript. Es ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.