JS-Funktionsaufruf, Anwenden und Binden einer superdetaillierten Methode

JS-Funktionsaufruf, Anwenden und Binden einer superdetaillierten Methode

JS-Funktionsaufruf, Apply- und Bind-Methoden

1. call()-Methode

Durch Aufrufen call() wird die Zielfunktion sofort ausgeführt und die Referenz this innerhalb der Funktion geändert. Dies zeigt auf den ersten Parameter der Methode, und alle nacheinander aufgelisteten Parameter werden nacheinander als Parameter der Zielfunktion übergeben.

/* Normalmodus */

lass obj = {
  Summe(a, b) {
    console.log(dies)
    gib a + b zurück
  }
}

// Führen Sie die Methoden apply und bind der Funktion sum aus. Das ausgegebene Ergebnis ist das gleiche wie unten. obj.sum.call() // Fenster drucken
obj.sum.call(undefined, 1, 2) // Fenster drucken
obj.sum.call(null, 1, 2) // Fenster drucken

/* Strikter Modus */
„streng verwenden“

// Führe die Methoden apply und bind der Funktion sum aus und drucke dies wie folgt aus: obj.sum.call() // Drucke undefined
obj.sum.call(undefined, 1, 2) // druckt undefined
obj.sum.call(null, 1, 2) // gibt null aus

1. Simulationsimplementierung der call()-Methode

Wichtige Punkte:

  • myCall() wird dem Funktionsprototypobjekt hinzugefügt. Wenn die Zielfunktion diese Methode aufruft, zeigt dies innerhalb der Methode myCall() auf die Zielfunktion.
  • Führen Sie die Zielfunktion als Methode des Kontextobjekts aus, sodass diese innerhalb der Zielfunktion auf das Kontextobjekt verweist.
  • Entfernen Sie die Zielfunktion aus dem Kontextobjekt
  • Verwenden Sie den Spread-Operator ... um die an die Zielfunktion übergebenen Parameter zu verarbeiten

Bei der Simulationsimplementierung der Methoden call(), apply() und bind() wird, wenn der erste Parameter nicht übergeben wird oder undefiniert ist oder null übergeben wird, hier im JS-Normalmodus und im strikten Modus eine einheitliche Verarbeitung durchgeführt, d. h. dies zeigt innerhalb der Zielfunktion auf das Fensterobjekt.

Der Code lautet wie folgt:

Function.prototype.myCall = Funktion (Kontext, ...Argumente) {
  if (Kontext === undefiniert || Kontext === null) {
    Kontext = Fenster
  }
  // Die folgende Zeile ist der Kerncode context.fn = this
  const Ergebnis = Kontext.fn(...args)
  lösche context.fn
  Ergebnis zurückgeben
}

lass obj1 = {
  Grundzahl: 1,
  Summe(a, b) {
    console.log(dies)
    gib dies zurück.basicNum + a + b
  }
}
let obj2 = {
  Grundzahl: 9
}
console.log(obj1.sum.call(obj2, 2, 3)) // 14
console.log(obj1.sum.myCall(obj2, 2, 3)) // 14

2. apply()-Methode

Durch den Aufruf apply() wird die Zielfunktion sofort ausgeführt und die Referenz this innerhalb der Funktion geändert. Dies zeigt auf den ersten Parameter der Methode. Der zweite Parameter ist ein Parameterarray oder ein Argumentobjekt . Jeder Parameter, der durch jedes Arrayelement oder Argumentobjekt dargestellt wird, wird einzeln als Parameter der Zielfunktion übergeben.

1. Simulationsimplementierung der apply()-Methode

Wichtige Punkte:

  • myApply() wird dem Funktionsprototypobjekt hinzugefügt. Wenn die Zielfunktion diese Methode aufruft, zeigt dies innerhalb der Methode myApply() auf die Zielfunktion.
  • Führen Sie die Zielfunktion als Methode des Kontextobjekts aus, sodass diese innerhalb der Zielfunktion auf das Kontextobjekt verweist.
  • Entfernen Sie die Zielfunktion aus dem Kontextobjekt
  • Verwenden Sie den Spread-Operator ... um die an die Zielfunktion übergebenen Parameter zu verarbeiten

Der Code lautet wie folgt:

Function.prototype.myApply = Funktion (Kontext, Argumente) {
  if (Kontext === undefiniert || Kontext === null) {
    Kontext = Fenster
  }
  // Die folgende Zeile ist der Kerncode context.fn = this
  const Ergebnis = Kontext.fn(...args)
  lösche context.fn
  Ergebnis zurückgeben
}

console.log(obj1.sum.apply(obj2, [2, 3])) // 14
console.log(obj1.sum.myApply(obj2, [2, 3])) // 14

3. bind()-Methode

  • Der Aufruf bind() gibt eine neue Funktion zurück – eine Kopie der Zielfunktion. this innerhalb der Funktion zeigt auf den ersten Parameter der Methode, und alle nacheinander aufgelisteten Parameter werden nacheinander als Parameter der Zielfunktion übergeben. Das anschließende Ausführen der neuen Funktion entspricht dem Ausführen der Zielfunktion.
  • bind() implementiert Funktionscurrying, sodass Sie Parameter zweimal an die Zielfunktion übergeben können. Der erste Parameter wird nach dem ersten Parameter der Methode bind() aufgeführt, und der zweite Parameter wird in der neuen Funktion aufgeführt.

1. Simulationsimplementierung der bind()-Methode

Wichtige Punkte:

  • myBind() wird dem Funktionsprototypobjekt hinzugefügt. Wenn die Zielfunktion diese Methode aufruft, zeigt das this innerhalb der Methode myBind() auf die Zielfunktion.
  • Führen Sie die Zielfunktion als Methode des Kontextobjekts aus, sodass diese innerhalb der Zielfunktion auf das Kontextobjekt verweist.
  • Entfernen Sie die Zielfunktion aus dem Kontextobjekt
  • Verwenden Sie den Spread-Operator ... , um die anfänglichen und nachfolgenden Parameter zu verarbeiten, die an die Zielfunktion übergeben werden.

Der Code lautet wie folgt:

Function.prototype.myBind = Funktion (Kontext, ...initArgs) {
  if (Kontext === undefiniert || Kontext === null) {
    Kontext = Fenster
  }
  // Diesen Wert zwischenspeichern const _this = this
  Rückgabefunktion (...args) {
    // Die folgende Zeile ist der Kerncode context.fn = _this
    const Ergebnis = Kontext.fn(...initArgs, ...args)
    lösche context.fn
    Ergebnis zurückgeben
  }
}

console.log(obj1.sum.bind(obj2, 2)(3)) // 14
console.log(obj1.sum.myBind(obj2, 2)(3)) // 14

IV. Fazit

Gemeinsamkeiten und Unterschiede der drei Verfahren:

Ähnlichkeiten:
Beide können den internen this-Punkt ändern, wenn die Zielfunktion ausgeführt wird. Der erste Parameter der Methode wird verwendet, um den internen this-Wert anzugeben, wenn die Funktion ausgeführt wird. Es wird die Übergabe einer beliebigen Anzahl von Parametern an die Zielfunktion unterstützt. Wenn an den ersten Parameter der Methode kein Wert übergeben wird oder undefined oder null übergeben wird, dann zeigt this im normalen JavaScript-Modus innerhalb der Zielfunktion auf das Fensterobjekt und im strikten Modus auf undefined bzw. null.

Der Unterschied:
Die Methode apply() akzeptiert zwei Parameter, während die Methoden call() und bind() mehrere Parameter akzeptieren.
Wenn die Methode apply() Parameter an die Zielfunktion übergibt, muss sie nur das Parameter-Array oder das Argumentobjekt als zweiten Parameter der Methode übergeben, während die Methoden call() und bind() die Parameter nach einem Parameter der Methode einzeln auflisten müssen.
Wenn die Methoden call() und apply() aufgerufen werden, wird die Zielfunktion sofort ausgeführt, die Methode bind() jedoch nicht. Sie gibt eine neue Funktion zurück – eine Kopie der Zielfunktion. Das this innerhalb der Funktion zeigt auf den ersten Parameter der Methode bind(). Das anschließende Ausführen der neuen Funktion ist gleichbedeutend mit dem Ausführen der Zielfunktion.
Nur die Methode bind() implementiert das Funktionscurrying und kann daher Parameter zweimal an die Zielfunktion übergeben.

Oben sind die Details der äußerst detaillierten Methoden zum Aufrufen, Anwenden und Binden von JS-Funktionen aufgeführt. Weitere Informationen zu den Methoden zum Aufrufen, Anwenden und Binden von JS-Funktionen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Grundlagen der funktionalen Programmierung in JavaScript
  • Ein Artikel bringt Ihnen die Vererbung von JS-Funktionen bei
  • JavaScript-Grundlagenreihe: Funktionen und Methoden
  • Fallstudie zu JavaScript-Funktionsaufrufen, Apply- und Bind-Methoden
  • Detaillierte Erklärung des Unterschieds zwischen Pfeilfunktionen und normalen Funktionen in JavaScript
  • JavaScript-Wissen: Konstruktoren sind auch Funktionen
  • Verwendung der JavaScript-Sleep-Funktion
  • Detaillierte Beispiele für Variablen- und Funktionspromotion in JavaScript
  • Zusammenfassung von über 50 Hilfsfunktionen in JavaScript
  • 15 JavaScript-Funktionen, die es wert sind, gesammelt zu werden

<<:  Lösen Sie das Problem, dass der häufig verwendete Linux-Befehl "ll" ungültig ist oder der Befehl nicht gefunden wird

>>:  MySQL-Methode und Beispiel für langsame Abfragen

Artikel empfehlen

Vier Methoden zur Verwendung von JS zur Bestimmung von Datentypen

Inhaltsverzeichnis Vorwort 1. Art von 2. Instanz ...

Lösung für das Problem, dass der Docker-Container nicht gestoppt werden kann

Die Lösung lautet wie folgt: 1. Container löschen...

Vue implementiert einen Scrollbar-Stil

Zuerst wollte ich den Stil der Bildlaufleiste des...

Implementierungsprinzip und Skriptcode der HTML-Rabattpreisberechnung

Code kopieren Der Code lautet wie folgt: <!DOC...

MySQL 5.6 Installationsschritte mit Bildern und Text

MySQL ist ein Open-Source-Verwaltungssystem für k...

Mysql löst das N+1-Abfrageproblem der Datenbank

Einführung In Orm-Frameworks wie Hibernate und My...

Detailliertes Tutorial zum Bereitstellen von Apollo mit Docker

1. Einleitung Ich werde hier nicht näher auf Apol...

Designtheorie: Zu den Themen Schema, Ressourcen und Kommunikation

<br />In vielen kleinen Unternehmen besteht ...

MySQL GROUP_CONCAT-Einschränkungslösung

Wirkung: Die Funktion GROUP_CONCAT kann einen Fel...