Arrow-Funktionen: Anonym und kompakt
Eine Arrow Function wird definiert mit einem
- Paar runder Klammern für die Liste der Parameter
- gefolgt von einem »fetten Pfeil« => und
- einem Paar geschweifter Klammern für den Funktionskörper mit den Anweisungen.
Am Rande: Die Zeichenkombination aus Gleichheitszeichen und Größer-Zeichen wird auch als Fat Arrow bzw. Fetter Pfeil => bezeichnet.
// klassische Schreibweise
let doppelt = function (num) {
return num * 2;
}
// ist dasselbe wie let doppelt = (num) => { return num * 2 } ▲ ▲ ▲ ▲ | | | | └-┬-┘ └-------┬--------┘ | | runde Klammern -┘ geschweifte Klammern // oder kurz bei nur einem Parameter let doppelt = num => num * 2;
Hat die Arrow-Function nur einen Parameter, können die runden Klammern weggelassen werden, und wenn die Funktion nur aus einer Anweisung besteht, muss die Anweisung auch nicht in geschweifte Klammern gesetzt werden.
function (x,y) { return x+y; }
(x,y) => x+y;
- Eine Arrow-Funktion erzeugt keinen eigenen Ausführungskontext – anders als Funktions-Ausdrücke oder deklarative Funktionen, die ihr eigenes this je nach Aufruf erzeugen.
- Arrow-Funktionen sind anonyme Funktionen: Ihr Name ist ein leerer String.
- In einer Arrow-Funktion gibt es kein arguments-Objekt.
Beispiel für einfache Arrow-Funktionen
array.some () (ES5) prüft, ob ein Element eines Arrays einen Test besteht, hier, ob ein Element des Arrays 0 ist.
const numbers = [1, 5, 10, 0]; numbers.some (item => item === 0); //console.log ( numbers.some (item => item === 0) );
liefert true, weil ein Element des Arrays den Wert 0 hat. Schön kurz. Am wirkungsvollsten sind kurze Arrow-Funktionen ohne Verschachteln.
this in Arrow Functions
Für alle diejenigen, denen das this in inneren Funktionen nie ganz geheuer ist: Arrow-Funktionen übernehmen das this (den lexikalischen Kontext) von ihrem umfassenden Block.
Das Schlüsselwort this ist alles andere als intuitiv und in inneren Funktionen läßt this Einsteiger für lange Zeit an den Nägeln kauen. ES6 verbessert this in der Arrow-Funktion durch einen lexikalischen Kontext, so dass bind(this) oder das Speichern des Kontext in let self = this nicht mehr gebraucht werden.
const student = {
courses: ['Lineare Algebra',
'Semantik von Programmiersprachen',
'Betriebssysteme'],
noten: [ 2.3, 3.0, 1.7 ],
// Such den Kurs mit der beste Note
getBestNote: function() {
let self = this; // 'this' einfangen
let bestNode = function() {
return Math.max(...self.noten);
};
return this.courses[this.noten.indexOf(bestNode())];
}
};
Die Arrow-Funktion übernimmt das this vom umschließenden Scope, also vom Objekt student. Das Beste: let self = this ist überflüssig. Das liest sich einfacher und ist schön kompakt.
Arrow Functions – Ausnahmen
Sie können nicht jede Javascript-Funktion ersetzen, sondern sind für besondere Funktionen gedacht. Arrow-Funktion können überall dort eingesetzt werden, wo ein anonymer Funktions-Ausdruck erforderlich ist (z.B. bei Callback-Funktionen wie in den Array-Methoden map(), filter(), sort().
Was Arrow-Funktionen von klassischen Funktionen unterscheidet: Sie haben keine arguments-Bindung und können nicht als Konstruktor-Funktionen eingesetzt werden, also auch nicht mit new aufgerufen werden.
Und mehr: Arrow functions dürfen keine Argument mit denselben Namen haben.
Keine doppelten Namen
const arrowParams = (a, b, a) => {
}
SyntaxError: Duplicate parameter 'a' not allowed in an arrow function.
Kein arguments
const arrowParams = (p1, p2) => {
if (arguments.length == 1) {
return "Und wo ist der Rest?";
}
}
const anwser = arrowParams (17,24)
ReferenceError: Can't find variable: arguments