So verwenden Sie Pfeilfunktionen in JavaScript

So verwenden Sie Pfeilfunktionen in JavaScript

Die Pfeilfunktionssyntax wurde mit ECMascript6 eingeführt: Durch die Verwendung dieser neuen Syntax können wir in einigen (aber nicht allen) Fällen prägnante und lesbare Code erzeugen, insbesondere wenn unsere Funktion nur einen Ausdruck enthält. In diesem Tutorial werden wir sehen, wie wir eine Pfeilfunktion definieren können, welche Unterschiede mit Standardfunktionen sind und welche Fälle die Verwendung von Pfeilfunktionen nicht angemessen sind.

In diesem Tutorial lernen Sie:

  • Was ist eine Pfeilfunktion.
  • Wie eine Pfeilfunktion definiert ist.
  • Die Unterschiede zwischen Pfeilfunktionen und Standardfunktionen.
  • Die Fälle, in denen Pfeilfunktionen nicht verwendet werden können.

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Betriebssystem agnostisch.
Software Eine Installation von Knoten Um dieses Tutorial in einer Nicht-Browser-Umgebung zu verfolgen.
Andere Kenntnis von JavaScript und objektorientierten Konzepten.
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können

Was ist eine "Pfeilfunktion"?

Die Pfeilfunktionen wurden mit ECMascript6 eingeführt: Durch die Verwendung dieser neuen Syntax können wir häufig mehr präzisen Code erhalten, in einigen Fällen, in denen Multi-Line-Rückrufe in Einzeiler übersetzen, dank Funktionen wie dem implizite Rendite. Aufgrund seiner Besonderheiten können Pfeilfunktionen jedoch nicht überall Standardfunktionen ersetzen: Es gibt einige Kontexte, in denen wir sie nicht verwenden können, und wir werden sehen, warum.



Von Standardfunktionen bis hin zu Pfeilfunktionen

In diesem Absatz sehen wir ein Beispiel dafür, wie wir eine Standardfunktion durch eine Pfeilfunktion ersetzen können: Wir werden einen Rückruf höherer Ordnung als perfektes Beispiel dafür verwenden.

Wie Sie sicher wissen, eine Funktionen höherer Ordnung ist eine Funktion, die eine andere Funktion zurückgibt oder eine andere Funktion als Argument akzeptiert. In diesem Beispiel werden wir verwenden Filter, oder Array.Prototyp.Filter wenn du möchtest. Diese Methode der Array -Objekt, Nimmt eine Funktion als Argument an und gibt ein neues Array zurück, das von allen Elementen des ursprünglichen Arrays besiedelt ist, die für den in der Rückruffunktion implementierten Test positiv sind.

Sehen wir uns ein Beispiel für die Verwendung des Filters mit einer klassischen Funktion an. Stellen Sie sich vor, wir haben eine Reihe von Objekte, Jeder von ihnen repräsentiert Charaktere aus dem Buch „Lord of the Rings“:

const charnes = [name: 'frodo', race: 'hobbit', name: 'sam', race: 'hobbit', name: 'legolas', race: 'Elf', name: ' Aragorn ', Rasse:' Man ', Name:' Boromir ', Rasse:' Man '] 
Kopieren

Der Figuren Array enthält 5 Elemente; Jeder von ihnen hat zwei Eigenschaften: Name Und Wettrennen. Nehmen wir nun an, wir möchten ein neues Array erstellen, das nur von den Charakteren bevölkert wird, die zur Rasse der Männer gehören. Mit Filter und der Standardfunktionssyntax schreiben wir:

const männer = Zeichen.Filter (Funktion filterMen (Element) Rückgabeelement.Rasse == 'Mann'; ); 
Kopieren

Wie bereits erwähnt, Filter, Nimmt eine Funktion als Argument an: Bei Verwendung der Standardsyntax kann diese Funktion entweder genannt oder anonym genannt werden. In den meisten Situationen werden anonyme Funktionen als Rückrufe verwendet, um dieses Beispiels willen, und um später einen der Unterschiede zwischen Standard- und Pfeilfunktionssyntax hervorzuheben, gaben wir unserer Funktion einen Namen: Filternen.

Die Rückruffunktion, mit der verwendet werden soll Filter, nimmt nur einen obligatorisch Parameter, das das Element des ursprünglichen Arrays ist, das jedes Mal verarbeitet wird. Wenn die Funktion zurückgibt WAHR, Das Element wird als Mitglied des Neuarrays eingefügt, wenn die Funktion zurückgibt FALSCH Das Element ist nicht. In diesem speziellen Fall haben wir einen einfachen Test definiert:

Charakter.Rasse == 'Mann' '
Kopieren

Dieser Test kehrt zurück WAHR Wenn der WettrennenEigenschaft des Elements, das verarbeitet wird, entspricht dem String 'Man'. Hier ist das Ergebnis dessen, was wir oben geschrieben haben:

[Name: 'Aragorn', Rasse: "Man ', Name:' Boromir ', Rasse:" Man'] 
Kopieren

Nehmen wir nun an, wir möchten den obigen Code mit einem neu refaktorieren Pfeilfunktion. Wir würden schreiben:

const männer = Zeichen.filter (Element => Element.Rasse == 'Mann'); 
Kopieren

Durch Verwendung der Pfeilfunktionen Syntax, wir konnten das gleiche Ergebnis des vorherigen Beispiels mit nur einer Codezeile erzielen: Wie schön ist das?!. Mach dir keine Sorgen, wenn die neue Syntax auf den ersten Blick dich verwirrt, lesen Sie einfach weiter. Lesen Sie einfach weiter.

Die Pfeilfunktionssyntax

Während wir eine Standardfunktion definieren, indem wir die verwenden Funktion Schlüsselwort, eine Pfeilfunktion wird durch die Verwendung des => Symbol. Dies ist offensichtlich nicht der einzige Unterschied zwischen den beiden: Eine der wichtigsten, die wir hier hervorheben sollten, ist, dass klassische Funktionen zwar in Funktionsausdrücken entweder genannt werden oder anonym, Pfeilfunktionen immer anonym sind.



Argumente in Pfeilfunktionen definieren

Im vorherigen Beispiel, da wir das loswerden Funktion Schlüsselwort, das erste, was wir lesen können, ist Element, Welches ist das Argument, das von der Pfeilfunktion akzeptiert wird. Die Regel, die bei der Definition der Argumente, die durch eine Pfeilfunktion erwartet werden, zu folgen, ist einfach: Wenn die Funktion mehrere Argumente oder überhaupt keine Argumente akzeptiert, müssen wir sie zwischen Klammern einschließen; Wenn die Funktion nur ein Argument enthält, wie es in unserem Beispiel der Fall ist, können wir die Klammern vollständig weglassen.

Stellen Sie sich als Beispiel vor, wir möchten eine Funktion definieren, die das Produkt von zwei Zahlen zurückgibt, die als Argumente übergeben wurden. Wir würden schreiben:

// Da die Funktion zwei Parameter nimmt, müssen wir Klammern konstant multiplizieren = (a, b) => a * b; 
Kopieren

Implizite Rückkehr und lockige Zahnspangen

In allen obigen Beispielen haben Sie möglicherweise das Fehlen einer anderen Sache bemerken: die Geschweifte Klammern welches den Körper der Funktion begrenzt. Warum haben wir sie weggelassen?? Wenn der Körper der Pfeilfunktion nur aus einem Ausdruck besteht, können die lockigen Klammern weggelassen werden: Wenn dies der Fall ist, wird das Ergebnis des Ausdrucks implizit zurückgegeben:

// Wenn wir lockige Klammern weglassen, wird das Ergebnis des Ausdrucks implizit zurückgegeben. multiplizieren (2,3); 6 // Ergebnis ist 6: Es wird implizit zurückgegeben // Wenn wir lockige Klammern verwenden, wird das Ergebnis nicht implizit zurückgegeben. Undefiniert // Ergebnis wird undefiniert sein, da wir das Ergebnis des Ausdrucks nicht ausdrücklich zurückgeben 
Kopieren

Im obigen Code haben wir eine sehr einfache Funktion definiert, multiplizieren: Diese Funktion erwartet zwei Parameter, daher müssen wir sie zwischen Klammern einschließen. Der => Symbol definiert die Pfeilfunktion. Im ersten Beispiel, da wir nur einen Ausdruck haben, der das Produkt der beiden als Parameter übergebenen Zahlen zurückgibt, können wir lockige Klammern weglassen und die implizite Rückgabefunktion nutzen.

Im zweiten Beispiel haben wir die lockigen Klammern verwendet, daher kehrte die Funktion zurück nicht definiert, Da wir keine implizite Rendite haben: um das erwartete Ergebnis zu erzielen, hätten wir verwenden sollen zurückkehren ausdrücklich.

Mehrere Aussagen oder Ausdrücke im Funktionskörper

Curly -Zahnspangen sind auch die einzige Möglichkeit, mehrere Aussagen oder Ausdrücke in einer Pfeilfunktion anzugeben. Nehmen wir beispielsweise an, dass wir, anstatt das Produkt zweier Zahlen zurückzugeben, unsere Funktion eine Zeichenfolge ausgeben soll, wobei es angezeigt wird:

const multiply = (a, b) => const product = a*b; Konsole.log ('das Produkt von $ a und $ b ist $ product');  multiplizieren (2,3); Das Produkt von 2 und 3 ist 6 
Kopieren

Was ist, wenn unsere Pfeilfunktionen ein Objektliteral zurückgeben müssen, das selbst durch lockige Zahnspangen abgegrenzt wird? In diesem Fall müssen wir das Objektliteral zwischen Klammern einschließen:



const createChar = (Zeichenname, ZeichenRace) => (Name: Zeichenname, Rasse: CharakterRace); createechar ('gimli', 'zwarf') name: "gimli ', race:" zwarf' 
Kopieren

Wie Das verhält sich in Pfeilfunktionen

Einer der relevantesten, wenn nicht der relevanteste Unterschied zwischen klassischen Funktionen und Pfeilfunktionen ist, wie die Das Arbeiten. Dieser Unterschied ist der Hauptgrund, warum wir in einigen Fällen keine Pfeilfunktionen verwenden können, wie wir bald sehen werden. Bevor Sie die Unterschiede hervorheben, Lassen Sie uns zusammenfassen, wie Das funktioniert, wenn es in Standardfunktionen verwendet wird. Das erste, was man sich erinnern sollte, ist das, der Wert von Das wird dadurch bestimmt, wie die Funktion selbst aufgerufen wird, sehen wir einige Beispiele an.

Der Standard: Das ist ein Hinweis auf den globalen Umfang

Wenn Das wird in einer eigenständigen Funktion verwendet, und wir arbeiten nicht in strikter Modus, Es verweist auf den globalen Umfang, das ist das Fenster Objekt in einer Browserumgebung oder der globales Objekt im Knoten.JS. In der gleichen Situation, aber im strengen Modus, Das wird sein nicht definiert Und wir erhalten einen Fehler:

var i = 20; // Hier haben wir var verwendet, anstatt es zu lassen, weil letztere keine Eigenschaft im globalen Bereich erstellt. Funktion foo () Konsole.Protokoll (dies.ich);  // Nicht-Strect-Modus foo () 20 // Strict Mode Foo () TypeERRror: Eigenschaft 'I' von undefined kann nicht lesen 
Kopieren

Implizite Bindung

Wenn in einem Objekt auf eine Standardfunktion verwiesen wird und diese Funktion mit diesem Objekt als a aufgerufen wird Kontext, Verwenden der Punktnotation, Das wird ein Hinweis auf dieses Objekt. Wir nennen es implizite Bindung:

Funktion foo () Konsole.Protokoll (dies.ich);  let object = i: 20, foo: foo // Die FOO -Eigenschaft ist ein Verweis auf die FOO -Funktion Objekt.foo () // Dies ist ein Verweis auf Objekt, also dies.Ich ist Objekt.i 20 
Kopieren

Explizite Bindung

Wir sagen, dass wir eine verwenden explizite Bindung Wenn wir explizit was erklären, was Das sollte sich verweisen. Es kann durch die Verwendung der verwendet werden Forderung, anwenden oder binden Methoden einer Funktion (die in JavaScript selbst ein erstklassiges Objekt ist. Denken Sie an den ersten Fall, den wir oben erwähnt haben, wenn die Standardbindung gilt:

var i = 20; Funktion foo () Konsole.Protokoll (dies.ich);  const Object = i: 100 foo () // Dies gibt 20 aus oder generiert ein Typeerror im strengen Modus. // Wenn wir dies ausdrücklich so einstellen, dass sich die Dinge ändern, ändert sich die Dinge. // Rufen Sie an und wenden Sie an, die Funktion sofort mit dem neuen Kontext ausführen: foo.Rufen Sie (Objekt) // Ausgabe 100 foo.Anwenden (Objekt) // Ausgabe ist 100 // Binden Sie stattdessen eine neue Funktion mit dem angegebenen Kontext zurück. lass bodefoo = foo.Bind (Objekt) bordefoo () // Ausgabe ist 100 
Kopieren

Das sind einige Unterschiede zwischen Forderung, anwenden Und binden: Das Relevante ist, dass letztere a zurückgibt a neue Funktion an den angegebenen Kontext gebunden, während mit den anderen beiden die an den angegebene Kontext gebundene Funktion sofort ausgeführt wird. Es gibt andere Unterschiede, aber wir werden sie hier nicht sehen. Das Wichtigste ist zu verstehen, wie explizit Bindung funktioniert.

Wie Pfeilfunktionen unterschiedlich sind in Das betrachten?

In allen obigen Fällen und Beispielen haben wir gesehen, wie bei der Verwendung von Standardfunktionen der Wert von Das hängt davon ab, wie die Funktion genannt wird. Pfeilfunktionen verwenden stattdessen die lexikalisch das: Sie haben keine eigenen Das, benutze aber immer die Das aus ihrem umschließenden Umfang. Ein typisches Beispiel, bei dem dies unerwartete Effekte auf Ereignishörer erzeugen kann. Angenommen, wir haben eine Schaltfläche mit ID "Button1" und möchten seinen Text ändern, wenn er klickt:



Klick mich! // Der Ereignishörer mit einer Standardfunktion als Rückrufdokument.getElementById ('Button1').AddEventListener ('Click', Function () this.InnerText = "klickte!";) 
Kopieren

Der Code funktioniert perfekt und sobald die Schaltfläche klickt, ändert sich der Text wie erwartet. Was ist, wenn wir in diesem Fall eine Pfeilfunktion verwenden?? Angenommen, wir schreiben es so:

dokumentieren.getElementById ('Button1').AddEventListener ('Click', () => Dies.InnerText = "klickte!";)) 
Kopieren

Der obige Code funktioniert nicht, warum? Einfach: Weil, wie wir bereits gesagt haben, im ersten Beispiel, Das In der Standard -Rückruffunktion verweist das Objekt, auf dem das Ereignis auftritt (die Schaltfläche), wenn wir die Pfeilfunktion verwenden Das wird aus dem übergeordneten Umfang geerbt, in diesem Fall die Fenster Objekt. Aus Vollständigkeit sollten wir sagen, dass das obige Beispiel leicht repariert werden kann, um mit einer Pfeilfunktion zu arbeiten:

dokumentieren.getElementById ('Button1').AddEventListener ('Click', Event => Ereignis.Ziel.InnerText = "klickte!";)) 
Kopieren

Diesmal funktioniert der Code, weil wir nicht benutzt haben Das Um auf die Schaltfläche zu verweisen, aber wir lassen unsere Funktion ein Argument akzeptieren, nämlich Fall. In der Funktionskörper, die wir verwendet haben Fall.Ziel auf das Objekt verweisen, das das Ereignis versandte.

Aus dem gleichen Grund, warum wir oben erwähnt haben, können Pfeilfunktionen nicht als Objektmethoden oder Prototypmethoden verwendet werden:

// Pfeilfunktionen funktionieren nicht als Objektmethoden… const Object1 = i: 1000, foo: () => Konsole.log ('Der Wert von i ist $ this.i ') Objekt1.foo () Der Wert von I ist undefiniert //… und sie funktionieren nicht als Prototypmethoden. const Person = Funktion (Name, Alter) this.Name = Name; Das.Alter = Alter;  Person.Prototyp.Einführung = () => Konsole.log ('Mein Name ist $ this.Name und ich bin $ dies.Alter Jahre alt '); const Jack = neue Person ('Jack', 100); Jack.Name 'Jack' Jack.Alter 100 Jack.introy () mein Name ist undefiniert und ich bin undefinierte Jahre alt 
Kopieren

Schlussfolgerungen

Die Pfeilfunktionssyntax ist eine sehr schöne Funktion, die mit ECMascript6 eingeführt wird. Mit dieser neuen Art, Funktionen zu definieren, können wir einen kürzeren und saubereren Code schreiben. Wir haben gesehen, wie man eine Pfeilfunktion definiert und wie die neue Syntax funktioniert.

Wir haben auch gesehen, warum Pfeilfunktionen unter allen Umständen keine Standardfunktionen ersetzen können, weil sie keine eigenen haben Das, und verwendet den von ihrem umschließenden Umfang: Dies macht sie, wie wir in diesem Tutorial gesehen haben. Wenn Sie an anderen JavaScript -Tutorials interessiert sind, bleiben Sie dran: Im nächsten Tutorial werden wir darüber sprechen bringen, Funktion. In der Zwischenzeit können Sie unseren Artikel über Versprechen überprüfen.

Verwandte Linux -Tutorials:

  • Advanced Bash Regex mit Beispielen
  • Einführung in JavaScript -Schleifen
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Mastering -Bash -Skriptschleifen beherrschen
  • Dinge zu installieren auf Ubuntu 20.04
  • Verschachtelte Schleifen in Bash -Skripten
  • Bash Regexps für Anfänger mit Beispielen
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • GDB -Debugging -Tutorial für Anfänger
  • Erstellen Sie Umleitungs- und Umschreiben von Regeln in .Htaccess auf Apache…