Expressões de Função Nomeadas em JavaScript

Suponha que temos uma expressão de função como esta:

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

test(); // exibirá '!'

Vamos dar um nome func para a nossa função:

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

test();

Como você já sabe, não é possível acessar a função por este nome de fora:

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

test(); // exibirá '!'
func(); // lançará um erro

Por que dar um nome à função se ele não estará disponível? A questão é que este nome será inacessível de fora da função, mas estará disponível dentro dela.

Vamos verificar:

javascriptlet test = function func() {
  console.log(func); // a função exibirá seu próprio código-fonte
};

test(); // chamamos a função

Vamos chamar nossa função dentro dela mesma:

javascriptlet test = function func() {
  console.log('!'); // exibimos '!'
  func(); // chamamos a nós mesmos
};

test();

Se executarmos este código, será exibido um número infinito de saídas no console.

Na verdade, nossa função pode ser chamada dentro de si mesma não apenas como func, mas também como test:

javascriptlet test = function func() {
  console.log('!');
  test(); // chamamos a nós mesmos
};

test();

Qual é a diferença? A diferença é que o nome test é apenas uma variável. Durante a execução do script, nossa função pode ser atribuída a outra variável ou passada como parâmetro - neste caso, a ligação entre a variável test e a função pode ser perdida.

O nome func, no entanto, está rigidamente vinculado à função especificamente para que possamos nos referir à nossa função dentro dela mesma.

Tais Expressões de Função com um nome são chamadas de expressões de função nomeadas.