Vorwort
Aufrufen und anwenden existieren, um den Kontext zu ändern, dh den Kontext, wenn eine Funktion ausgeführt wird. Mit anderen Worten, es soll die Richtung dieses innerhalb des Funktionskörpers verändern .
Die Funktion des Aufrufs und der Anwendung ist genau gleich, aber die Art und Weise, Parameter zu akzeptieren, ist unterschiedlich.
Methodendefinition
anwenden
Function.apply(obj,args) kann zwei Parameter empfangen:
OBJ: Dieses Objekt ersetzt dieses Objekt in der Funktionsklasse
ARGS: Dies ist ein Array- oder Klassenarray. Die Anwendenmethode übergibt die Elemente in dieser Sammlung als Parameter an die aufgerufene Funktion.
Anruf
Der erste Parameter der Aufrufmethode entspricht der Anwendenmethode , außer dass der zweite Parameter eine Parameterliste ist
Im Nicht-Streng-Modus weist dies in der Funktionskörper auf das Standard-Host-Objekt hin, wenn unser erster Parameter als null oder nicht definiert wird, und im Browser ist es Fenster
var test = function () {console.log (this === Fenster);} test.apply (null); // truetest.call (undefiniert); // trueVerwendung
Wie man andere "entführen"
Zu diesem Zeitpunkt wird die Logname -Methode in FOO von Bar referenz
var foo = {name: "mingming", logname: function () {console.log (this.name); }} var bar = {name: "xiaowang"}; foo.logname.call (bar); // xiaowangVererbung erkennen
Funktion Animal (Name) {this.name = name; this.showname = function () {console.log (this.name); }} Funktion cat (name) {Animal.call (this, name); } var cat = new Cat ("schwarze Katze"); Cat.Showname (); // schwarze KatzeIn der tatsächlichen Entwicklung wird dies häufig versehentlich die Szenarien verändert.
Es gibt eine lokale lustige Methode. Wenn Spaß als normale Funktion genannt wird, zeigt dieses Innere Spaß auf das Fenster , aber wir möchten oft, dass er auf den #Test -Knoten verweist, sehen Sie den folgenden Code:
window.id = "window"; document.querySelector ('#test'). onclick = function () {console.log (this.id); // test var fun = function () {console.log (this.id); } fun (); // Fenster}Verwenden Sie den Anruf, bewerben Sie sich leicht, wir können dieses Problem leicht lösen
window.id = "window"; document.querySelector ('#test'). onclick = function () {console.log (this.id); // test var fun = function () {console.log (this.id); } fun.call (this); // test}Natürlich können Sie dies tun, aber im strengen Modus von ECMascript 5 wurde dies in diesem Fall angegeben, dass es nicht auf das globale Objekt verweist, sondern nicht definiert ist:
window.id = "window"; document.querySelector ('#test'). onclick = function () {var that = this; console.log (this.id); // test var fun = function () {console.log (that.id); } fun (); // test} Funktion func () {"Strict" -Alert (this); // Ausgabe: undefined} func ();Andere Verwendung
Klassenarray
Hier werden Objekte, die die folgenden Bedingungen erfüllen
1. haben Längenattribut
2. Speichern Sie die Daten gemäß Index
3. Push, Pop und andere Methoden, die keine Arrays haben
Zu den allgemeinen Klassenanordnungen gehören Argumente und Nodelist!
(Funktion () {Array.Prototype.push.call (Argumente, 4); console.log (Argumente); // [1, 2, 3, 4]}) (1,2,3)Auf diese Weise geben Sie eine 4 in die Argumente ein
Array.prototype.push kann die Kombination von zwei Arrays implementieren
Die Push -Methode liefert kein Array Push, aber es liefert Push (Param1, Param,… Paramn), sodass Sie das Array auch durch Anwenden installieren und ersetzen können, dh:
var arr1 = new Array ("1", "2", "3"); var arr2 = new Array ("4", "5", "6"); Array.Prototype.push.Apply (arr1, arr2); console.log (arr1); // ["1", "2", "3", "4", "5", "6"]Es kann auch auf diese Weise verstanden werden, arr1 ruft die Push -Methode auf und die Parameter werden durch Anwenden der Array -Montage in einen Satz von Parameterlisten ersetzt.
Zum Beispiel möchte ich den Höchstwert in der Klassenarray finden
(function () {var maxnum = math.max.apply (null, argumente); console.log (maxnum); // 56}) (34,2,56);Richtertyp
console.log (Object.Prototype.toString.call (123)) // [Objektnummer] console.log (Object.Prototype.toString.call ('123')) // [Object String] console.log (Object.Prototype.toString.call (und definiert)) // [Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Object. Undefined]console.log(Object.prototype.toString.call(true)) //[object Boolean]console.log(Object.prototype.toString.call({})) //[object Object]console.log(Object.prototype.toString.call([])) //[object Array] console.log (Object.Prototype.toString.call (function () {})) // [Objektfunktion]Das obige ist der vollständige Inhalt der Zusammenfassung der Verwendung von Antrag und Anruf. Jeder ist herzlich eingeladen, eine Nachricht zu hinterlassen, um an der Diskussion teilzunehmen. Ich hoffe auch, dass dieser Artikel für alle im Lernen von JavaScript hilfreich ist.