eingehendes Verständnis von JavaScript-Pfeilfunktionen. Wir zeigen Ihnen, wie Sie die ES6 -Arrow -Syntax verwenden, sowie einige häufige Fehler, die Sie bei der Verwendung von Pfeilfunktionen in Ihrem Code bewusst sind. Sie werden viele Beispiele sehen, die veranschaulichen, wie es funktioniert.
Nach der Veröffentlichung von ECMascript 2015 (auch als ES6 bekannt) erschien JavaScript -Pfeilfunktionen. Dank seiner prägnanten Syntax und der Umgang mit dem Schlüsselwort this
wurde die Pfeilfunktion schnell zu einer der Lieblingsfunktionen der Entwickler.
function
, Curly Accraces {}
und das Schlüsselwort return
, wenn es nur einen Ausdruck gibt, eliminiert. this
Pfeilfunktion erfasst ihren Wert, um den geschlossenen Kontext der Pfeilfunktion anzupassen, nicht dort, wo sie aufgerufen wird, was es für herkömmliche Funktionsausdrücke geeignet macht, die an eine externe this
gebunden werden müssen Kontextzustand. function
-Konstruktoren, da sie lexikalische this
-Bindungen haben und arguments
Objekte fehlen. .map()
, .sort()
, .forEach()
, .filter()
, .reduce()
, Pfeilfunktionssyntax: Schreiben Sie reguläre Funktionen
um Die
-Funktion ist wie ein Rezept, in dem Sie nützliche Anweisungen speichern können, um das zu erfüllen, was in Ihrem Programm passieren muss, z. B. eine Aktion oder die Rückgabe eines Wertes. Wenn Sie Ihre Funktion aufrufen, können Sie die im Rezept enthaltenen Schritte ausführen. Sie können dies jedes Mal tun, wenn Sie die Funktion aufrufen, ohne das Rezept immer wieder neu zu schreiben.// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Folgendes ist die Standardmethode, um eine Funktion zu deklarieren und sie in JavaScript aufzurufen:
const sayHiStranger = function () { return 'Hi, stranger!' }
Sie können auch dieselbe Funktion wie ein Funktionsausdruck wie folgt schreiben:
const sayHiStranger = () => 'Hi, stranger'
JavaScript -Pfeilfunktionen sind immer Ausdrücke. So schreiben Sie die obige Funktion als Pfeilfunktionsausdruck mit Fettpfeilnotation um:
<🎜> <🎜> Die Vorteile umfassen: <🎜>function
Schlüsselwort return
Schlüsselwort {}
In JavaScript lautet die Funktion "First Class Citizen". Sie können Funktionen in Variablen speichern, sie als Argumente an andere Funktionen übergeben und sie als Werte aus anderen Funktionen zurückgeben. Sie können all dies mit JavaScript -Pfeilfunktionen ausführen.
im obigen Beispiel hat die Funktion keine Parameter. In diesem Fall müssen Sie vor dem Symbol für Fettpfeil (= & gt;) eine Reihe leerer Klammern () () hinzufügen. Dies gilt auch, wenn Sie eine Funktion mit mehreren Parametern erstellen:
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Wenn es jedoch nur einen Parameter gibt, können Sie die Klammern weglassen (müssen dies nicht tun, aber es kann es können):
const sayHiStranger = function () { return 'Hi, stranger!' }
Aber sei vorsichtig. Wenn Sie beispielsweise den Standardparameter verwenden, müssen Sie ihn in Klammern einschließen:
const sayHiStranger = () => 'Hi, stranger'
Nur weil Sie können, heißt das nicht, dass Sie es sollten. Kyle Simpson (der Autor von "You Kenne JS JS") steckte mit einer unbeschwerten, gutherzigen Satire seine Gedanken darüber, Klammern in diesen Flussdiagramm zu weglassen. (Das Flussdiagramm sollte hier eingefügt werden, aber da das Bild nicht direkt eingefügt werden kann, wird es hier weggelassen)
Sie können die ES6 -Pfeilsyntax präziser machen, wenn nur ein Ausdruck im Funktionskörper vorhanden ist. Sie können alles auf eine Zeile legen, die lockigen Klammern entfernen und das Schlüsselwort return
entfernen.
Sie haben gerade gesehen, wie diese ordentlichen Codezeilen im obigen Beispiel funktionieren. Lassen Sie mich Ihnen ein weiteres Beispiel nur als Referenz geben. Die Funktion der Funktion "OrderBylikes () ist wie der Name: Es gibt ein Array von Netflix -Serienobjekten zurück, die in der Reihenfolge der höchsten Anzahl von Likes angeordnet sind:
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
Das ist cool, aber seien Sie vorsichtig mit der Lesbarkeit des Codes - insbesondere bei der Sortierung einer Reihe von Pfeilfunktionen mithilfe einer Codezeile und einer unverzweigten ES6 -Pfeilsyntax, wie in diesem Beispiel:
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
Was ist dort passiert? Versuchen Sie, die reguläre Funktionssyntax zu verwenden:
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
Jetzt können Sie schnell verstehen, wie der externe Funktionsgrüßer eine Parametergruß hat, und gibt eine anonyme Funktion zurück. Diese interne Funktion hat wiederum einen Parameter mit dem Namen namens Name und gibt eine Zeichenfolge mit Begrüßungs- und Namenswerten zurück. Hier erfahren Sie, wie Sie die Funktion nennen:
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
Wenn Ihre JavaScript -Pfeilfunktion mehrere Anweisungen enthält, müssen Sie alle Anweisungen in lockigen Klammern einschließen und das Schlüsselwort return
verwenden.
Im folgenden Code erstellt die Funktion ein Objekt mit einigen Titeln und Zusammenfassungen von Netflix -Serien (Netflix -Kommentare stammen von der faulen Tomaten -Website):
const greeter = greeting => name => `${greeting}, ${name}!`
.map()
wird durch eine Reihe von Anweisungen erweitert und schließlich ein Objekt zurückgibt. Dies macht es unvermeidlich, lockige Klammern um den Funktionskörper umsetzt.
Da Sie lockige Klammern verwenden, ist die implizite Rendite keine Option. Sie müssen das Schlüsselwort return
verwenden.
Wenn Ihre Funktion das Objektliteral mit implizitem Return zurückgibt, müssen Sie das Objekt in Klammern einschließen. Andernfalls führt dies zu einem Fehler, da die JavaScript -Engine fälschlicherweise die Klammern des Objekts wörtlich in die Klammern der Funktion analysiert. Wie Sie erst oben bemerkt haben, können Sie das Schlüsselwort return
nicht unterlassen, wenn Sie in der Pfeilfunktion lockige Klammern verwenden.
Die kürzere Version des vorherigen Code zeigt diese Syntax:
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Funktionen, die zwischen dem Schlüsselwort function
und der Parameterliste keine Namensbezeichnung haben, werden anonyme Funktionen bezeichnet. So sehen regelmäßige anonyme Funktionsausdrücke aus wie:
const sayHiStranger = function () { return 'Hi, stranger!' }
Pfeilfunktionen sind alle anonymen Funktionen:
const sayHiStranger = () => 'Hi, stranger'
Ab ES6 können Variablen und Methoden den Namen einer anonymen Funktion basierend auf ihrer syntaktischen Position unter Verwendung ihres name
-attributs schließen. Dies ermöglicht es, die Funktion zu erkennen, wenn sie ihren Wert überprüfen oder einen Fehler melden.
wenden Sie sich an anonymousarrowfunc:
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
Beachten Sie, dass dieses abgeleitete Attribut nur dann vorhanden ist, wenn anonyme Funktionen Variablen zugewiesen werden, wie im obigen Beispiel gezeigt. Wenn Sie anonyme Funktionen als Rückruffunktion verwenden, geht diese praktische Funktion verloren. Dies wird durch die folgende Demonstration veranschaulicht, wobei anonyme Funktionen in der Methode name
das Attribut .setInterval()
nicht verwenden können: name
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
kann immer noch nicht als geeignete Kennung verwendet werden, für die Sie die Funktion innerhalb der Funktion verweisen können - zum Beispiel für Rekursion, Ereignisse entbinden usw. name
Da ich denke, dass anonyme Funktionen nicht für die häufige Verwendung in Programmen geeignet sind, mag ich es nicht, das Formular für = & gt; Pfeilfunktion zu verwenden. —— "Du kennst JS nicht"wie man dieses Schlüsselwort
umgehen. Insbesondere wird das Schlüsselwort this
in der Pfeilfunktion nicht wiedergegeben. this
Dies ist eine Taste. Wenn Sie auf die Schaltfläche klicken, wird ein Rückwärtszähler von 5 bis 1 ausgelöst, der auf der Schaltfläche selbst angezeigt wird.
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
ein regelmäßiger anonymer Funktionsausdruck ist, keine Pfeilfunktion. Warum? Wenn Sie sich in der Funktion .addEventListener()
anmelden, werden Sie feststellen, dass es das Schaltflächenelement mit dem angehängten Hörer verweist. Dies ist genau das erwartete Ergebnis und das, was das Programm wie geplant funktionieren muss. this
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
Versuchen Sie jedoch, die reguläre Funktion durch die Pfeilfunktion wie folgt zu ersetzen:
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Jetzt zitiert this
keine Schaltflächen mehr. Stattdessen verweist es ein Fensterobjekt: (Das Bild sollte hier eingefügt werden, aber da das Bild nicht direkt eingefügt werden kann, wird es hier weggelassen)
Dies bedeutet, dass Ihr Code nicht funktioniert, wenn Sie nach dem Klicken auf die Schaltfläche eine Klasse zur Schaltfläche hinzufügen möchten, wie im folgenden Beispiel gezeigt: this
const sayHiStranger = function () { return 'Hi, stranger!' }
Wenn Sie die Pfeilfunktionen in JavaScript verwenden, wird der Wert des Schlüsselworts
nicht zurückgebracht. Es erbt vom übergeordneten Bereich (dies wird als lexikalischer Bereich bezeichnet). In diesem speziellen Fall wird die fragliche Pfeilfunktion als Argument an die this
-Methode übergeben, die sich im globalen Bereich befindet. Daher ist startBtn.addEventListener()
im Funktionshandler auch an den globalen Bereich gebunden - dh das Fensterobjekt. this
auf die Startschaltfläche in Ihrem Programm verweisen möchten, können Sie eine reguläre Funktion und keine Pfeilfunktion verwenden. this
-Methode in der obigen Demonstration. Hier finden Sie auch eine anonyme Funktion, diesmal ist es jedoch eine Pfeilfunktion. Warum? .setInterval()
: this
const sayHiStranger = () => 'Hi, stranger'
Tatsächlich hat sich der Kontext geändert, da sich
jetzt in einer ungebundenen oder globalen Funktion befindet, die als Argument an this
übergeben wird. Daher ändert sich auch der Wert des Schlüsselworts .setInterval()
, da es jetzt an den globalen Bereich gebunden ist. this
so zu speichern, sodass er weiter auf das erwartete Element verweist - in diesem Fall das Schaltflächenelement: this
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
verwenden, um dieses Problem zu lösen: .bind()
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
bei der Verwendung der Pfeilfunktion: this
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
Diesmal hat die Konsole die Tasten aufgezeichnet, was wir wollten. Tatsächlich ändert das Programm den Schaltflächentext, sodass es
auf das Schaltflächenelement verweist: this
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
hat keinen eigenen -Kontext this
. Sie erben vom Wert des Elternteils, und aufgrund dieses Merkmals werden sie in den oben genannten Situationen zu einer ausgezeichneten Wahl.
Pfeilfunktionen sind nicht nur eine schicke neue Art, JavaScript -Funktionen zu schreiben. Sie haben ihre eigenen Einschränkungen, was bedeutet, dass Sie es in einigen Fällen nicht verwenden möchten. Der Klick -Handler in der vorherigen Demonstration ist ein Beispiel, dies ist jedoch nicht der einzige. Lassen Sie uns noch ein paar überprüfen.
Pfeilfunktion wird nicht gut als Objektmethode verwendet. Hier ist ein Beispiel.
Betrachten Sie dieses Netflixseries -Objekt, das einige Eigenschaften und verschiedene Methoden aufweist. Rufen Sie console.log(netflixSeries.getLikes())
eine Nachricht mit der aktuellen Anzahl von Likes aus.
console.log(netflixSeries.addLike())
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
-Methode zurück. Daher können .getLikes()
und .addLike()
nicht auf die Eigenschaften eines Objekts this.title
bzw. this.likes
verweisen. title
likes
Das gleiche Problem liegt im lexikalischen Bereich der Pfeilfunktion.
this
Natürlich besteht die Lösung darin, die reguläre Funktion zu verwenden:
Verwenden Sie die Pfeilfunktion einer Bibliothek von Drittanbietern
const sayHiStranger = function () { return 'Hi, stranger!' }
auf nützliche Inhalte verweist. this
auf das DOM -Element des gebundenen Handlers zugreifen: this
const sayHiStranger = () => 'Hi, stranger'
Kontext - wir erhalten unerwartete Ergebnisse: this
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
-Haken created
an die VUE -Instanz, also wird die Nachricht "Hallo, Welt!" this
auf das übergeordnete Bereich, das nicht das Attribut this
hat: message
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
Objekte. Dies ist ein Array-ähnliches Objekt (kein vollständiges Array), das den an die Funktion übergebenen Wert speichert, wenn es aufgerufen wird. arguments
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Wenn Sie die Funktion aufrufen, erhalten Sie die folgende Fehlermeldung: Uncortn ReferenceError: Argumente sind nicht definiert. Dies bedeutet, dass das arguments
-Objekt in der Pfeilfunktion nicht verfügbar ist. Tatsächlich kann das Ersetzen der Pfeilfunktion durch eine reguläre Funktion das Problem lösen:
const sayHiStranger = function () { return 'Hi, stranger!' }
Wenn Sie daher arguments
Objekte benötigen, können Sie die Pfeilfunktion nicht verwenden.
Aber was ist, wenn Sie wirklich die Pfeilfunktion verwenden möchten, um dieselbe Funktion zu kopieren? Eine Sache, die Sie tun können, ist die verbleibenden Parameter von ES6 (...) zu verwenden. Hier erfahren Sie, wie Sie Ihre Funktion umschreiben:
const sayHiStranger = () => 'Hi, stranger'
in JavaScript zu lösen. Die Pfeilfunktion funktioniert auch gut mit Array -Methoden wie this
, .map()
, .sort()
, .forEach()
, .filter()
und .reduce()
. Aber denken Sie daran: Pfeilfunktionen ersetzen die regulären JavaScript -Funktionen nicht. Denken Sie daran, verwenden Sie sie nur, wenn Pfeilfunktionen das richtige Werkzeug sind.
Wenn Sie Fragen zu Pfeilfunktionen haben oder Hilfe benötigen, um sie korrekt zu verwenden, empfehle ich Ihnen, das sitePoint-freundliche Forum zu besuchen. Es gibt viele sachkundige Programmierer, die bereit sind, um zu helfen.
Sie können Pfeilfunktionen anhand der folgenden Syntax definieren: (Parameter) => Ausdruck. Zum Beispiel: (x, y) = & gt; x y definiert eine Pfeilfunktion, die zwei Parameter erfordert und ihre Summe zurückgibt.
Sie können Pfeilfunktionen anhand der folgenden Syntax definieren: (Parameter) => Ausdruck. Zum Beispiel: (x, y) = & gt; x y definiert eine Pfeilfunktion, die zwei Parameter erfordert und ihre Summe zurückgibt.
Die Pfeilfunktion und die reguläre Funktion unterscheiden sich in den folgenden Aspekten:
Sie haben keine eigenen this
. Stattdessen erben sie den Wert des umgebenden lexikalischen Bereichs.
Pfeilfunktionen können nicht als Konstruktoren verwendet werden, was bedeutet, dass Sie keine Instanzen von Objekten mit this
erstellen können.
Die Pfeilfunktion hat kein eigenes new
-Objekt. Stattdessen erben sie den geschlossenen Bereich arguments
.
Die Pfeilfunktion ist einfacher und geeigneter für einfache Einzelleitungsvorgänge. arguments
-Bindung zu vermeiden, da sie den umgebenden Kontext erben. Dies kann bestimmte Codierungsmuster vereinfachen und die Notwendigkeit von Problemumgehungen wie this
, bind
oder apply
verringern. call
Obwohl Pfeilfunktionen für viele Szenarien nützlich sind, funktionieren sie möglicherweise nicht in allen Fällen. Sie eignen sich am besten für kurze und einfache Funktionen. Traditionelle Funktionen können besser für komplexe Funktionen oder Funktionen geeignet sein, die einen eigenen this
-Kontext erfordern.
Die Pfeilfunktion wurde in ECMascript 6 (ES6) eingeführt und wird von modernen Browsern und Node.js -Versionen unterstützt. Sie werden in der modernen JavaScript -Entwicklung häufig eingesetzt.
-Pfeilfunktion kann nicht als Konstruktor verwendet werden, hat kein eigenes arguments
-Objekt und ist nicht sehr geeignet für Methoden, die einen dynamischen this
-Kontext erfordern. Darüber hinaus ist ihre prägnante Syntax möglicherweise nicht für Funktionen, die mehrere Anweisungen enthalten.
Ja, Pfeilfunktionen können für Methoden in Objekten oder Klassen verwendet werden. Denken Sie jedoch daran, dass die Pfeilfunktionen nicht über ihre eigenen this
verfügen, sodass sie möglicherweise nicht wie erwartet in Methoden funktionieren, die einen dynamischen this
-Kontext erfordern.
Wenn Objektliterale direkt aus Pfeilfunktionen zurückgegeben werden, muss das Objekt in Klammern eingeschlossen sein, um Verwirrung mit Funktionsblöcken zu vermeiden. Zum Beispiel: () = & gt; ({Schlüssel: Wert}).
Ja, wenn die Pfeilfunktion einen einzelnen Parameter akzeptiert, können die Klammern um den Parameter weggelassen werden. Zum Beispiel ist x = & gt; x * 2 eine gültige Pfeilfunktion.
Das obige ist der detaillierte Inhalt vonPfeilfunktionen in JavaScript: Fett & Concise Syntax. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!