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

JavaScript-Kreisdiagrammbeispiel

ZeicheneffekteImplementierungscode JavaScript var...

Zusammenfassung der für MySQL erforderlichen allgemeinen Kenntnisse

Inhaltsverzeichnis Primärschlüsseleinschränkung E...

Beispielcode zur Implementierung der Google-Anmeldung über Drittanbieter in Vue

Inhaltsverzeichnis 1. Konfiguration der Entwickle...

Docker exec führt mehrere Befehle aus

Der Befehl „Docker Exec“ kann Befehle in einem la...

Detaillierte Erläuterung der Datentypprobleme bei der JS-Array-Indexerkennung

Als ich ein WeChat-Applet-Projekt schrieb, gab es...

Warum wird in MySQL keine UTF-8-Kodierung verwendet?

MySQL UTF-8-Kodierung MySQL unterstützt UTF-8 sei...

Detaillierte Erklärung der Verwendung von Nginx proxy_redirect

Heute bin ich auf ein kleines Problem gestoßen, a...

Docker-Installations- und Konfigurationsschritte für MySQL

Inhaltsverzeichnis Vorwort Umfeld Installieren Er...

So starten Sie ein Vue-Projekt mit dem M1 Pro-Chip

Inhaltsverzeichnis Einführung Homebrew installier...

Verwenden von CSS3 zum Implementieren eines Schriftfarbverlaufs

Beim Verwenden von Animation.css habe ich festges...

So konfigurieren Sie Benutzerrollenberechtigungen in Jenkins

Die Jenkins-Konfiguration von Benutzerrollenberec...

Allgemeine Front-End-JavaScript-Methodenkapselung

Inhaltsverzeichnis 1. Geben Sie einen Wert ein un...

So mounten Sie eine Festplatte in Linux

Wenn Sie eine virtuelle Maschine verwenden, stell...