J'ai une fonction que j'essaye de convertir à la nouvelle syntaxe de flèche dans ES6 . C'est une fonction nommée:
function sayHello(name) {
console.log(name + ' says hello');
}
Existe-t-il un moyen de lui donner un nom sans instruction var:
var sayHello = (name) => {
console.log(name + ' says hello');
}
Évidemment, je ne peux utiliser cette fonction qu'après l'avoir définie. Quelque chose comme suivant:
sayHello = (name) => {
console.log(name + ' says hello');
}
Existe-t-il une nouvelle façon de procéder dans ES6 ?
Réponses:
Vous le faites comme vous l'avez exclu dans votre question: vous le placez à droite d'une affectation ou d'un initialiseur de propriété où le nom de variable ou de propriété peut raisonnablement être utilisé comme nom par le moteur JavaScript. Il n'y a pas d' autre moyen de le faire, mais cela est correct et entièrement couvert par la spécification.
Par spécification, cette fonction a un vrai nom
sayHello
:Ceci est défini dans Assignment Operators> Runtime Semantics: Evaluation où il appelle l'
SetFunctionName
opération abstraite (cet appel est actuellement à l'étape 1.e.iii).De même, Runtime Semantics: PropertyDefinitionEvaluation appelle
SetFunctionName
et donne donc à cette fonction un vrai nom:Les moteurs modernes définissent déjà le nom interne de la fonction pour des instructions comme celle-ci; Edge a toujours le bit le rendant disponible comme
name
sur l'instance de fonction derrière un indicateur d'exécution.Par exemple, dans Chrome ou Firefox, ouvrez la console Web, puis exécutez cet extrait:
Sur Chrome 51 et supérieur et Firefox 53 et supérieur (et Edge 13 et supérieur avec un indicateur expérimental), lorsque vous exécutez cela, vous verrez:
Notez le
foo.name is: foo
etError...at foo
.Sur Chrome 50 et versions antérieures, Firefox 52 et versions antérieures, et Edge sans l'indicateur expérimental, vous verrez cela à la place, car ils n'ont pas
Function#name
(encore) la propriété:Notez que le nom est absent de
foo.name is:
, mais il est affiché dans la trace de la pile. C'est juste que l'implémentation de laname
propriété sur la fonction était une priorité inférieure à certaines autres fonctionnalités ES2015; Chrome et Firefox l'ont maintenant; Edge l'a derrière un drapeau, sans doute ne sera-t-il pas longtemps derrière le drapeau.Correct. Il n'y a pas de syntaxe de déclaration de fonction pour les fonctions fléchées, uniquement la syntaxe d' expression de fonction , et il n'y a pas de flèche équivalente au nom dans une expression de fonction nommée à l'ancienne (
var f = function foo() { };
). Il n'y a donc pas d'équivalent à:Vous devez le diviser en deux expressions (je dirais que vous devriez le faire de toute façon ) :
Bien sûr, si vous devez mettre ceci là où une seule expression est requise, vous pouvez toujours ... utiliser une fonction flèche:
Je ne dis pas que c'est joli, mais cela fonctionne si vous avez absolument besoin d'un wrapper d'expression unique.
la source
let f = () => { /* do something */ };
attribue un nom à la fonction, celet g = (() => () => { /* do something */ })();
n'est pas le cas.o.foo = () => {};
ne donne pas de nom à la fonction. Ceci était intentionnel pour empêcher la fuite d'informations.Non. La syntaxe des flèches est un raccourci pour les fonctions anonymes. Les fonctions anonymes sont, eh bien, anonymes.
Les fonctions nommées sont définies avec le
function
mot - clé.la source
SetFunctionName
est utilisée.let a = () => {};
définit une fonction nommée (le nom esta
) à la fois selon les spécifications et dans les moteurs modernes (lancez une erreur dedans pour voir); ils ne prennent pas encore en charge laname
propriété (mais c'est dans les spécifications et ils y arriveront finalement).Si par «nommé», vous voulez dire que vous voulez
.name
propriété de votre fonction flèche soit définie, vous avez de la chance.Si une fonction de flèche est définie à droite d'une expression d'affectation, le moteur prendra le nom à gauche et l'utilisera pour définir les fonctions de flèche
.name
, par exempleCela dit, votre question semble être plus «puis-je obtenir une fonction de flèche à hisser?». La réponse à cette question est un grand «non», je le crains.
la source
name
propriété partout où la spécification ES2015 les oblige; ils y arriveront. C'est l'une des dernières choses sur la liste de conformité pour Chrome et même Chrome 50 ne l'a pas (Chrome 51 le fera enfin). Détails . Mais l'OP a spécifiquement exclu de faire cela (bizarrement).Il semble que cela sera possible avec ES7: https://babeljs.io/blog/2015/06/07/react-on-es6-plus#arrow-functions
L'exemple donné est:
Notez que pour que cela fonctionne avec babel, j'avais besoin d'activer la syntaxe ES7 stade 0 la plus expérimentale. Dans mon fichier webpack.config.js, j'ai mis à jour le chargeur babel comme suit:
la source
this.handleOptionsButtonClick = this.handleOptionsButtonClick.bind(this);
constructor() { this.handleOptionsButtonClick = (e) => {…}; }
ce qui est totalement équivalent au code de votre réponse mais qui fonctionne déjà dans ES6. Pas besoin d'utiliser.bind
.this
contexte"let a = () => {};
définit une fonction de flèche nommée appeléea
. Détails .En fait, cela ressemble à une façon de nommer les fonctions fléchées (au moins à partir de Chrome 77 ...) est de faire ceci:
la source
fn('yourName', ()=>{})
, ce qui pourrait maintenir 100% de la sémantique fonction correcte flèche, ou mieux encore un plugin pour babel « nommée syntaxe de la fonction flèche »:fn yourName() => {}
. L'un ou l'autre compilerait le code ci-dessus. Je pense que les flèches nommées seraient si BADA55afin d'écrire une fonction de flèche nommée, vous pouvez suivre l'exemple ci-dessous, où j'ai une classe nommée LoginClass et à l'intérieur de cette classe, j'ai écrit une fonction de flèche nommée , nommée
successAuth
classe LoginClass {la source
CECI EST ES6
Oui, je pense que ce que vous recherchez est quelque chose comme ceci:
la source
Vous pouvez ignorer la partie fonction et la partie flèche pour créer des fonctions. Exemple:
la source