# 01.ii Function Expression

**Function Expression** - объявление функции в контексте какого-либо выражения, например присваивания.

```javascript
// Function Declaration
function sum(a, b) {
  return a + b;
}

// Function Expression
const sum = function(a, b) {
  return a + b;
};

// Arrow funciton
const sum = (a, b) => a + b;
```

Основные особенности:

* функция всегда находится в зоне выражения;
* имеет опциональное имя;
* не воздействует на объект переменных;
* и создается на этапе интерпретации кода контекста.
* такую функцию нельзя вызвать до того, как интерпретатор дойдет до выполнения выражения

Специально для работы с рекурсией в JavaScript существует особое расширение функциональных выражений, которое называется _Named Function Expression_ (сокращённо `NFE`) или «именованное функциональное выражение». Особенность `NFE` в том, что она может рекурсивно вызывать себя по своему локальному имени:

```javascript
const func = function sayHi(...) {
    /* тело функции */
    return 1 + sayHi(...)
};
```

Предпочитайте использовать `NFE`:

* Легче читать сообщения об ошибке.
* Легче отлаживать
* Имя функции позволяет понять что она делает
* Можно делать рекурсивные вызовы этой функции

В отличие от function declaration, function expression всегда находится в зоне выражения:

```javascript
// в скобках (оператор группировки) может быть только выражение
(function foo() {});

// в инициализаторе массива - всегда выражение
[function bar() {}];

// запятая также оперирует выражениями
1, function alsoFE() {};
```
