Unzufrieden mit den anderen Antworten. Die am meisten bewertete Antwort vom 13.03.2019 ist faktisch falsch.
Die kurze knappe Version von dem, was =>
bedeutet, ist, dass es eine Abkürzung für das Schreiben einer Funktion UND für das Binden an das aktuelle this
ist
const foo = a => a * 2;
ist effektiv eine Abkürzung für
const foo = function(a) { return a * 2; }.bind(this);
Sie können sehen, dass alle Dinge verkürzt wurden. Wir brauchten weder function
, noch return
, noch .bind(this)
, noch Klammern oder Klammern
Ein etwas längeres Beispiel für eine Pfeilfunktion könnte sein
const foo = (width, height) => {
const area = width * height;
return area;
};
Das zeigt, dass wenn wir mehrere Argumente für die Funktion möchten, wir Klammern brauchen und wenn wir mehr als einen einzigen Ausdruck schreiben möchten, brauchen wir Klammern und ein explizites return
.
Es ist wichtig, den .bind
Teil zu verstehen, und es ist ein großes Thema. Es hat damit zu tun, was this
in JavaScript bedeutet.
ALLE Funktionen haben einen impliziten Parameter namens this
. Wie this
gesetzt wird, wenn eine Funktion aufgerufen wird, hängt davon ab, wie diese Funktion aufgerufen wird.
Nehmen Sie
function foo() { console.log(this); }
Wenn Sie es normal aufrufen
function foo() { console.log(this); }
foo();
wird this
das globale Objekt sein.
Wenn Sie im Strict-Modus sind
`use strict`;
function foo() { console.log(this); }
foo();
// oder
function foo() {
`use strict`;
console.log(this);
}
foo();
wird es undefined
sein
Sie können this
direkt mit call
oder apply
setzen
function foo(msg) { console.log(msg, this); }
const obj1 = {abc: 123}
const obj2 = {def: 456}
foo.call(obj1, 'hello'); // gibt Hallo {abc: 123} aus
foo.apply(obj2, ['hi']); // gibt Hi {def: 456} aus
Sie können this
auch implizit mit dem Punktoperator .
setzen
function foo(msg) { console.log(msg, this); }
const obj = {
abc: 123,
bar: foo,
}
obj.bar('Hola'); // gibt Hola {abc:123, bar: f} aus
Ein Problem entsteht, wenn Sie eine Funktion als Callback oder Listener verwenden möchten. Sie erstellen eine Klasse und möchten eine Funktion als Callback zuweisen, die auf eine Instanz der Klasse zugreift.
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name); // funktioniert nicht
});
}
}
Der obige Code funktioniert nicht, weil wenn das Element das Ereignis auslöst und die Funktion aufruft, der Wert von this
nicht die Instanz der Klasse sein wird.
Ein üblicher Weg, dieses Problem zu lösen, ist die Verwendung von .bind
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name);
}.bind(this); // <=========== HINZUGEFÜGT! ===========
}
}
Weil die Pfeil-Syntax dasselbe macht, können wir schreiben
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click',() => {
console.log(this.name);
});
}
}
bind
macht effektiv eine neue Funktion. Wenn bind
nicht existieren würde, könnten Sie im Grunde genommen Ihre eigene wie folgt machen
function bind(functionToBind, valueToUseForThis) {
return function(...args) {
functionToBind.call(valueToUseForThis, ...args);
};
}
In älterem JavaScript ohne den Spread-Operator würde es
function bind(functionToBind, valueToUseForThis) {
return function() {
functionToBind.apply(valueToUseForThis, arguments);
};
}
Das Verständnis dieses Codes erfordert ein Verständnis von Schließungen, aber die Kurzversion ist, dass bind
eine neue Funktion erstellt, die die ursprüngliche Funktion immer mit dem this
-Wert aufruft, der daran gebunden wurde. Pfeilfunktionen tun dasselbe, da sie eine Abkürzung für bind(this)
sind