Wie schreibe ich eine benannte Pfeilfunktion in ES2015?
Sie tun dies so, wie Sie es in Ihrer Frage ausgeschlossen haben: Sie platzieren es auf der rechten Seite einer Zuweisung oder eines Eigenschaftsinitialisierers, wobei die Variable oder der Eigenschaftsname von der JavaScript-Engine vernünftigerweise als Name verwendet werden kann. Es gibt keine andere Möglichkeit, dies zu tun, aber dies ist korrekt und wird vollständig von der Spezifikation abgedeckt.
Pro Spezifikation hat diese Funktion einen wahren Namen sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Dies wird unter Zuweisungsoperatoren> Laufzeitsemantik: Auswertung definiert, wo die abstrakte SetFunctionName
Operation aufgerufen wird (dieser Aufruf befindet sich derzeit in Schritt 1.e.iii).
In ähnlicher Weise ruft Runtime Semantics: PropertyDefinitionEvaluation aufSetFunctionName
und gibt dieser Funktion somit einen wahren Namen:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
Moderne Engines setzen den internen Namen der Funktion bereits für solche Anweisungen; Edge hat immer noch das Bit, das es wie name
auf der Funktionsinstanz hinter einem Laufzeitflag verfügbar macht .
Öffnen Sie beispielsweise in Chrome oder Firefox die Webkonsole und führen Sie dieses Snippet aus:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Auf Chrome 51 und höher und Firefox 53 und höher (und Edge 13 und höher mit einem experimentellen Flag) sehen Sie, wenn Sie dies ausführen:
foo.name ist: foo
Error
bei foo (http://stacksnippets.net/js:14:23)
unter http://stacksnippets.net/js:17:3
Beachten Sie das foo.name is: foo
und Error...at foo
.
In Chrome 50 und früheren Versionen, Firefox 52 und früheren Versionen und Edge ohne das experimentelle Flag wird dies stattdessen angezeigt, da sie Function#name
(noch) nicht über die Eigenschaft verfügen :
foo.name ist:
Error
bei foo (http://stacksnippets.net/js:14:23)
unter http://stacksnippets.net/js:17:3
Beachten Sie, dass der Name von fehlt foo.name is:
, aber es ist in dem Stack - Trace angezeigt. Es ist nur so, dass die tatsächliche Implementierung der name
Eigenschaft für die Funktion eine niedrigere Priorität hatte als einige andere ES2015-Funktionen. Chrome und Firefox haben es jetzt; Edge hat es hinter einer Flagge, vermutlich wird es nicht mehr lange hinter der Flagge sein.
Natürlich kann ich diese Funktion erst verwenden, nachdem ich sie definiert habe
Richtig. Es gibt keine Funktion Deklaration Syntax für Pfeil Funktionen, nur die Funktion Ausdruck Syntax, und es gibt keine Entsprechung in einem alten Stil benannte Funktion Ausdruck (auf den Namen Pfeil var f = function foo() { };
). Es gibt also kein Äquivalent zu:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
Sie müssen es in zwei Ausdrücke aufteilen (ich würde argumentieren, dass Sie das trotzdem tun sollten ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
Wenn Sie dies dort platzieren müssen , wo ein einzelner Ausdruck erforderlich ist, können Sie natürlich immer ... eine Pfeilfunktion verwenden:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
Ich sage nicht, dass das hübsch ist, aber es funktioniert, wenn Sie unbedingt einen Wrapper mit einem einzelnen Ausdruck benötigen.