Unzufrieden mit den anderen Antworten. Die am häufigsten gewählte Antwort vom 13.3.2019 ist sachlich falsch.
Die kurze, knappe Version von =>
bedeutet, dass es sich um eine Verknüpfung handelt, die eine Funktion schreibt UND sie an den aktuellen Wert bindetthis
const foo = a => a * 2;
Ist effektiv eine Abkürzung für
const foo = function(a) { return a * 2; }.bind(this);
Sie können alle Dinge sehen, die gekürzt wurden. Wir brauchten function
weder 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;
};
Zeigen, dass wir, wenn wir mehrere Argumente für die Funktion wünschen, Klammern benötigen und wenn wir mehr als einen einzelnen Ausdruck schreiben möchten, Klammern und einen expliziten Ausdruck benötigen 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
beim Aufrufen einer Funktion festgelegt wird, hängt davon ab, wie diese Funktion aufgerufen wird.
Nehmen
function foo() { console.log(this); }
Wenn Sie es normal nennen
function foo() { console.log(this); }
foo();
this
wird das globale Objekt sein.
Wenn Sie sich im strengen Modus befinden
`use strict`;
function foo() { console.log(this); }
foo();
// or
function foo() {
`use strict`;
console.log(this);
}
foo();
Es wird sein undefined
Sie können this
direkt mit call
oder einstellenapply
function foo(msg) { console.log(msg, this); }
const obj1 = {abc: 123}
const obj2 = {def: 456}
foo.call(obj1, 'hello'); // prints Hello {abc: 123}
foo.apply(obj2, ['hi']); // prints Hi {def: 456}
Sie können auch this
implizit mit dem Punktoperator festlegen.
function foo(msg) { console.log(msg, this); }
const obj = {
abc: 123,
bar: foo,
}
obj.bar('Hola'); // prints Hola {abc:123, bar: f}
Ein Problem tritt auf, wenn Sie eine Funktion als Rückruf oder Listener verwenden möchten. Sie erstellen eine Klasse und möchten eine Funktion als Rückruf zuweisen, die auf eine Instanz der Klasse zugreift.
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name); // won't work
});
}
}
Der obige Code funktioniert nicht, da der this
Wert nicht die Instanz der Klasse ist, wenn das Element das Ereignis auslöst und die Funktion aufruft .
Ein üblicher Weg, um dieses Problem zu lösen, ist die Verwendung .bind
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name);
}.bind(this); // <=========== ADDED! ===========
}
}
Weil die Pfeilsyntax dasselbe tut, was wir schreiben können
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click',() => {
console.log(this.name);
});
}
}
bind
macht effektiv eine neue Funktion . Wenn bind
es das nicht gäbe, könnten Sie es sich im Grunde so machen
function bind(funcitonToBind, valueToUseForThis) {
return function(...args) {
functionToBind.call(valueToUseForThis, ...args);
};
}
In älterem JavaScript ohne den Spread-Operator wäre dies der Fall
function bind(funcitonToBind, valueToUseForThis) {
return function() {
functionToBind.apply(valueToUseForThis, arguments);
};
}
Um diesen Code zu verstehen, müssen Sie die Schließungen verstehen. In der Kurzversion wird jedoch bind
eine neue Funktion erstellt, die immer die ursprüngliche Funktion mit dem this
daran gebundenen Wert aufruft . Die Pfeilfunktion macht dasselbe, da sie eine Abkürzung für istbind(this)