> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/c-functions/c1-functions/01-functions.md).

# 01. Functions

Функция в JS -- это объект, с которым связан исполняемый код. Базовый синтаксис функции:

```javascript
function имя(параметры, через, запятую) {
  код функции
  return value;
}
```

Пример:

```javascript
// function declaration
function isEven(num) {
  return num % 2 === 0;
}
isEven(24); // => true
isEven(11); // => false
```

Параметры и аргументы:

* Функция при вызове может принимать определенные значения, называемые её *параметрами*.
* Значения параметров, передаваемые при вызове функций называются её *аргументами*.
* Передаваемые значения копируются в параметры функции и становятся локальными переменными.

Возвращаемое значение:

* Функция всегда вычисляется в какое либо значение, которое подставляется на месте её вызова.
* Если возврат из функции происходит в результате выполнения инструкции `return`, возвращается значение выражения, следующего за инструкцией `return`, или `undefined`, если инструкция `return` не имеет выражения.
* Вызов `return` тут же прекращает функцию. Пустой `return` означает возврат `undefined`.

Область видимости:

* Каждая функция внутри фигурных скобок `{...}` определяет собственную область видимости.
* Переменные, объявленные внутри функции не видны за её пределами (локальные переменные).
* Функция имеет доступ и может использовать все переменные, определенные в окружающей её области (замыкание).
* Функции могут определяться внутри других функций. Функция, объявленная внутри другой функции имеет доступ как к переменным внутри внешней функции, так и к переменным во всех внешних областях видимости.

Функции как значения:

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