Dans le cas de l'expression de fonction anonyme, la fonction est anonyme - littéralement, il n'a pas de nom. La variable à laquelle vous l'assignez a un nom, mais la fonction n'en a pas. (Mise à jour : c'était vrai jusqu'à ES5. Depuis ES2015 [alias ES6], il arrive souvent qu'une fonction créée avec une expression anonyme reçoive un vrai nom [mais pas un identifiant automatique], lisez la suite...)
Les noms sont utiles. Les noms peuvent être vus dans les traces de pile, les piles d'appels, les listes de points d'arrêt, etc. Les noms sont une bonne chose™.
(Il fallait auparavant se méfier des expressions de fonctions nommées dans les anciennes versions d'IE [IE8 et inférieur], car elles créaient par erreur deux objets fonctionnels complètement distincts à deux moments complètement différents [plus d'informations dans mon article de blog Double prise ]. Si vous devez prendre en charge IE8 [ !!], il est probablement préférable de s'en tenir aux expressions de fonctions anonymes ou aux fonctions déclarations mais évitez les expressions de fonctions nommées).
Un élément clé d'une expression de fonction nommée est qu'elle crée un identifiant de portée avec ce nom pour la fonction dans le corps de la fonction :
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
Depuis ES2015, cependant, de nombreuses expressions de fonctions "anonymes" créent des fonctions avec des noms, et cela a été précédé par divers moteurs JavaScript modernes qui sont assez intelligents pour déduire les noms du contexte. Dans l'ES2015, votre expression de fonction anonyme donne lieu à une fonction portant le nom de boo
. Cependant, même avec la sémantique ES2015+, l'identifiant automatique n'est pas créé :
var obj = {
x: function() {
console.log(typeof x); // "undefined"
console.log(obj.x.name); // "x"
},
y: function y() {
console.log(typeof y); // "function"
console.log(obj.y.name); // "y"
}
};
obj.x();
obj.y();
L'affectation du nom de la fonction se fait avec la fonction SetFunctionName opération abstraite utilisée dans diverses opérations de la spécification.
En résumé, chaque fois qu'une expression de fonction anonyme apparaît sur le côté droit d'une affectation ou d'une initialisation, par exemple :
var boo = function() { /*...*/ };
(ou cela pourrait être let
ou const
plutôt que var
) ou
var obj = {
boo: function() { /*...*/ }
};
ou
doSomething({
boo: function() { /*...*/ }
});
(ces deux derniers sont en fait la même chose) la fonction résultante aura un nom ( boo
dans les exemples).
Il y a une exception importante et intentionnelle : L'assignation à une propriété d'un objet existant :
obj.boo = function() { /*...*/ }; // <== Does not get a name
Cela s'explique par les problèmes de fuite d'informations soulevés lorsque la nouvelle fonctionnalité était en cours d'ajout ; détails dans ma réponse à une autre question. aquí .