Jak napisać nazwaną funkcję strzałki w ES2015?
Robisz to tak, jak wykluczyłeś swoje pytanie: Umieszczasz go po prawej stronie inicjatora przypisania lub właściwości, gdzie zmienna lub nazwa właściwości może być słusznie używana jako nazwa przez silnik JavaScript. Nie ma innego sposobu, aby to zrobić, ale jest to prawidłowe i całkowicie objęte specyfikacją.
Zgodnie ze specyfikacją ta funkcja ma prawdziwą nazwę sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Jest to zdefiniowane w Operatory przypisania> Runtime Semantics: Ocena, w której wywołuje operację abstrakcyjnąSetFunctionName
(to wywołanie jest obecnie w kroku 1.e.iii).
Podobnie Runtime Semantics: PropertyDefinitionEvaluation wywołuje, SetFunctionName
a tym samym nadaje tej funkcji prawdziwą nazwę:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
Nowoczesne silniki już ustawiają wewnętrzną nazwę funkcji dla takich instrukcji; Edge wciąż ma bit, dzięki czemu jest dostępny jak name
w instancji funkcji za flagą środowiska wykonawczego.
Na przykład w Chrome lub Firefox otwórz konsolę internetową, a następnie uruchom ten fragment kodu:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
W Chrome 51 i nowszych oraz Firefox 53 i nowszych (oraz Edge 13 i nowszych z flagą eksperymentalną) po uruchomieniu zobaczysz:
foo.name to: foo
Błąd
w foo (http://stacksnippets.net/js:14:23)
na http://stacksnippets.net/js:17:3
Zwróć uwagę na foo.name is: foo
i Error...at foo
.
W Chrome 50 i wcześniejszych, Firefox 52 i wcześniejszych oraz Edge bez flagi eksperymentalnej, zobaczysz to zamiast tego, ponieważ nie mają jeszcze tej Function#name
właściwości:
foo.name to:
Błąd
w foo (http://stacksnippets.net/js:14:23)
na http://stacksnippets.net/js:17:3
Zauważ, że brakuje nazwy foo.name is:
, ale jest ona wyświetlana w śladzie stosu. Tyle, że faktyczne wdrożenie name
właściwości w funkcji miało niższy priorytet niż niektóre inne funkcje ES2015; Chrome i Firefox mają to teraz; Edge ma go za flagą, prawdopodobnie nie będzie już dłużej za flagą.
Oczywiście mogę korzystać z tej funkcji tylko po jej zdefiniowaniu
Poprawny. Nie ma składni deklaracji funkcji dla funkcji strzałek, tylko składnia wyrażeń funkcyjnych i nie ma strzałki równoważnej nazwie w nazwanym wyrażeniu funkcyjnym w starym stylu ( var f = function foo() { };
). Więc nie ma odpowiednika:
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
Musisz podzielić to na dwa wyrażenia (twierdzę, że i tak powinieneś to zrobić ) :
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));
Oczywiście, jeśli mają umieścić to gdzie wymagana jest pojedynczym wyrazem, zawsze można skorzystać z funkcji ... strzałki:
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
Nie mówię, że to ładne, ale działa, jeśli absolutnie, pozytywnie potrzebujesz opakowania pojedynczego wyrażenia.