# Named function expressions in JavaScript

Suppose we have such a functional expression:

`let test = function() { console.log('!'); }; test(); // shows '!'`

Let's name our function `func`:

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

As you already know, this name does not refer to the function:

`let test = function func() { console.log('!'); }; test(); // shows '!' func(); // throws an error`

Why we give a name to function if it won't be available? The thing is that this name will not be available outside the function, but it will be available inside this function.

Let's check:

`let test = function func() { console.log(func); // the function will output its own source code }; test(); // call the function`

Let's call our function within itself:

`let test = function func() { console.log('!'); // shows '!' func(); // calls iself }; test();`

If you run this code, then an infinite number of alerts will be displayed in the console.

In fact, our function can be called internally not only as `func`, but also as `test`:

`let test = function func() { console.log('!'); test(); // calls iself }; test();`

What is the difference? The difference is that the name `test` is just a variable. While the script is running, our function may be written to another variable or passed as a parameter - in this case, the connection between the variable `test` and the function may be lost.

The name `func` is hardcoded to the function specifically so that we can refer to our function within itself.

Such Function Expressions with a function name are called named function expressions.

←→
↑
en ru