Expressions de fonction nommées en JavaScript

Supposons que nous ayons une expression de fonction comme celle-ci :

javascriptlet test = function() {
  console.log('!');
};

test(); // affichera '!'

Donnons un nom func à notre fonction :

javascriptlet test = function func() {
  console.log('!');
};

test();

Comme vous le savez déjà, on ne peut pas accéder à la fonction par ce nom :

javascriptlet test = function func() {
  console.log('!');
};

test(); // affichera '!'
func(); // générera une erreur

Alors, pourquoi donner un nom à la fonction s'il ne sera pas accessible ? Le fait est que ce nom sera inaccessible depuis l'extérieur de la fonction, mais accessible à l'intérieur de cette fonction.

Vérifions :

javascriptlet test = function func() {
  console.log(func); // la fonction affichera son propre code source
};

test(); // nous appelons la fonction

Appelons notre fonction à l'intérieur d'elle-même :

javascriptlet test = function func() {
  console.log('!'); // nous affichons '!'
  func(); // nous nous appelons nous-mêmes
};

test();

Si vous exécutez ce code, une quantité infinie de sorties sera affichée dans la console.

En fait, notre fonction peut être appelée à l'intérieur d'elle-même non seulement comme func, mais aussi comme test :

javascriptlet test = function func() {
  console.log('!');
  test(); // nous nous appelons nous-mêmes
};

test();

Quelle est la différence ? La différence est que le nom test est simplement une variable. Pendant le processus d'exécution du script, notre fonction peut être assignée à une autre variable ou passée comme paramètre - dans ce cas, le lien entre la variable test et la fonction peut disparaître.

Le nom func, quant à lui, est rigidement lié à la fonction spécialement pour pouvoir se référer à notre fonction à l'intérieur d'elle-même.

De telles Function Expression avec un nom de fonction sont appelées expressions de fonction nommées.