Come faccio a scrivere una funzione freccia denominata in ES2015?
Lo fai come hai escluso nella tua domanda: lo metti sul lato destro di un assegnazione o inizializzatore di proprietà in cui la variabile o il nome della proprietà può ragionevolmente essere usato come nome dal motore JavaScript. Non c'è altro modo per farlo, ma farlo è corretto e completamente coperto dalle specifiche.
Per spec, questa funzione ha un vero nome, sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Questo è definito in Operatori di assegnazione> Semantica di runtime: valutazione in cui chiama l' SetFunctionName
operazione astratta (quella chiamata è attualmente al passaggio 1.e.iii).
Analogamente, Runtime Semantics: PropertyDefinitionEvaluation chiama SetFunctionName
e quindi dà a questa funzione un nome vero:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
I motori moderni impostano il nome interno della funzione per affermazioni del genere già; Edge ha ancora il bit che lo rende disponibile come name
nell'istanza della funzione dietro un flag di runtime.
Ad esempio, in Chrome o Firefox, apri la console Web ed esegui questo frammento:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Su Chrome 51 e versioni successive e Firefox 53 e versioni successive (e Edge 13 e versioni successive con un flag sperimentale), quando lo esegui, vedrai:
foo.name è: foo
Errore
su foo (http://stacksnippets.net/js:14:23)
su http://stacksnippets.net/js:17:3
Nota il foo.name is: foo
e Error...at foo
.
Su Chrome 50 e precedenti, Firefox 52 e precedenti e Edge senza il flag sperimentale, lo vedrai invece perché non hanno Function#name
(ancora) la proprietà:
foo.name è:
Errore
su foo (http://stacksnippets.net/js:14:23)
su http://stacksnippets.net/js:17:3
Si noti che manca il nome foo.name is:
, ma viene mostrato nella traccia dello stack. È solo che implementare effettivamente la name
proprietà sulla funzione ha avuto una priorità inferiore rispetto ad alcune altre funzionalità ES2015; Chrome e Firefox lo hanno ora; Edge ce l'ha dietro una bandiera, presumibilmente non sarà molto più a lungo dietro la bandiera.
Ovviamente, posso usare questa funzione solo dopo averla definita
Corretta. Non esiste una sintassi di dichiarazione di funzione per le funzioni freccia, solo la sintassi dell'espressione di funzione e non esiste una freccia equivalente al nome in un'espressione di funzione denominata vecchio stile ( var f = function foo() { };
). Quindi non c'è equivalente a:
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
Devi dividerlo in due espressioni (direi che dovresti farlo comunque ) :
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));
Naturalmente, se si dispone di mettere questo in cui è richiesta una sola espressione, è sempre possibile ... utilizzare una funzione freccia:
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
Non sto dicendo che sia carino, ma funziona se hai assolutamente, positivamente bisogno di un unico wrapper di espressioni.