# 01.i Function Declaration

**Function Declaration** - функция, объявленная в основном потоке кода, имя которой регистрируется в текущем пространстве имен. К таким функциями относят обычные объявления функции:

```javascript
// function declaration
function isEven(num) {
  return num % 2 === 0;
}

isEven(24); // => true
isEven(11); // => false
```

Основная особенность функций данного типа заключается в том, что только они воздействуют текущее пространство имен. К моменту этапа интерпретации кода контекста, эти функции уже доступны для использования, т.к. попадают в окружение при построении пространства имен.

Основные свойства:

* Функция обязательно имеет имя;
* Функция "поднимается" вверх, т.е. функцию можно использовать выше её объявления.
* Создается на этапе входа в контекст;
* Новая функция создается в текущем пространстве имен.
* Анонимные функции не могут быть созданы таким образом.
* Находится в коде непосредственно: либо на уровне Программа (*Program*), либо внутри другой функции (*Function Body*);
* Воздействует на объект переменных (имя этой функции записывается в окружение контекста);
* Объявление функции Function Declaration, сделанное в блоке, видно только в этом блоке (ES6).

Такие функции можно использовать и до их объявления, т.к. они поднимаются наверх (правило подъема работает только в текущем scope.):

```javascript
// Hoisted variable
console.log(hello("Aliens")); // => 'Hello Aliens!'
// Named function
console.log(hello.name); // => 'hello'
// Variable holds the function object
console.log(typeof hello); // => 'function'

function hello(name) {
  return `Hello ${name}!`;
}
```
