N'oubliez pas de nom de l'expression des fonctions anonymes, peuvent rendre plus difficile à localiser le problème une Erreur de la pile d'appel (Discussion)
Réponse originale à cette question ci-dessous
MDN a une bonne course vers le bas sur la façon dont le nom de la fonction d'inférence œuvres, dont deux mises en garde:
Observations
Il est non-standard, <function>.name
d'inférence du comportement dans les deux scénarios suivants:
- lors de l'utilisation de script interprètes
L'interpréteur de script permettra de définir un nom de la fonction, bien que si une fonction n'a pas une propriété appelée du nom de...
- lors de l'utilisation de js outillage
Être prudent lors de l'utilisation de la Fonction.le nom et le code source de transformations telles que celles menées par le JavaScript compresseurs (minifiers) ou obfuscators
....
Dans la version non compressée du programme s'exécute dans le truthy-branche et les journaux " foo " est une instance de 'Foo', tandis que dans la version compressée il se comporte différemment et fonctionne dans l'autre branche. Par conséquent, si vous comptez sur la Fonction.nom comme dans l'exemple ci-dessus, assurez-vous que votre build pipeline ne change pas les noms de fonction ou de ne pas assumer une fonction pour avoir un nom particulier.
Quel est le nom de la fonction d'inférence?
L' name
propriété renvoie le nom d'une fonction, ou (avant ES6 implémentations) une chaîne vide pour les fonctions anonymes
function doSomething() {}
console.log(doSomething.name); // logs "doSomething"
Fonctions créées avec la syntaxe d'une Fonction nouvelle(...) ou tout simplement de la Fonction(...) ont leur nom de la propriété est définie sur une chaîne vide. Dans les exemples suivants, les fonctions anonymes sont créés, le nom renvoie une chaîne vide
var f = function() {};
var object = {
someMethod: function() {}
};
console.log(f.name == ''); // true
console.log(object.someMethod.name == ''); // also true
Les navigateurs qui implémentent ES6 fonctions peuvent déduire le nom d'une fonction anonyme à partir de sa position syntaxique. Par exemple:
var f = function() {};
console.log(f.name); // "f"
Avis
Personnellement, je préfère (flèche) fonctions attribuées à une variable pour trois raisons essentielles:
Tout d'abord, je n'ai pas jamais utiliser function.name
Deuxièmement, le mélange portée lexicale des fonctions nommées avec l'affectation se sent un peu en vrac:
// This...
function Blah() {
//...
}
Blah.propTypes = {
thing: PropTypes.string
}
// ...is the same as...
Blah.propTypes = {
thing: PropTypes.string
}
function Blah() {
//...
}
// ALTERNATIVELY, here lexical-order is enforced
const Blah = () => {
//...
}
Blah.propTypes = {
thing: PropTypes.string
}
Et troisièmement, toutes choses étant égales par ailleurs, je préfère flèche fonctions:
- communiquer au lecteur qu'il n'y a pas d'
this
, n arguments
etc
- regarde mieux (à mon humble avis)
- les performances (la dernière fois que j'ai regardé, flèche fonctions ont été légèrement plus rapide)
EDIT: instantanés de la Mémoire
J'ai été l'écoute d'un Podcast et invité a parlé d'une situation étaient, il avait à faire avec les limitations de l'utilisation de la flèche fonctions avec le profilage de la mémoire, j'ai été dans l' exacte même situation avant.
Actuellement, instantanés de la mémoire ne sera pas inclure un nom de variable - de sorte que vous pourriez trouver vous-même la conversion de flèche de fonctions de fonctions nommées juste à brancher le profileur de mémoire. Mon expérience a été assez simple, et je suis toujours heureux avec flèche fonctions.
En Plus je ne l'ai utilisé instantanés de la mémoire une fois, je me sens à l'aise renoncer à certains "instrumention" pour (subjective) de clarté par défaut.