# Функції

Функції — це можливість створювати власні команди.

Часто буває ситуація, коли якийсь блок коду повторюється в програмі більше одного разу. Так ось, ви можете цьому блоку коду дати ім'я, і це буде називатися функцією. Потім можна буде викликати цю функцію багато разів, так само як ви викликаєте функції `console.log`, `alert`, `prompt` і т.д.

Функція може мати параметри (ще їх називають аргументи) — їх визначають у заголовку функції, що вона приймає на вхід при виклику. Параметри можуть використовуватися всередині функції для здійснення будь-яких дій або обчислення значення, що повертається функцією.

Наприклад, функція console.log приймає параметр, який вона виводить на екран. Функція Math.min (1,2) приймає два параметри, і повертає найменше число з переданих їй.

Оголосити функцію можна за допомогою ключового слова `function`, за яким слідує ім'я функції і список її аргументів, розділених комою і заключений в дужки.

```javascript
function funcName(arg1, arg2, ...) {
    // do something
}
```

Приклад функції, яка робить щось корисне:

```javascript
function good(name) {
   console.log("YOU ARE COOL, " + name + "! :-)");
}
```

Цей код створить функцію (команду) з назвою `good`, але не викличе її. Тепер, якщо раптово нам треба вивести на екран якесь мотиваційне повідомлення, ми можемо просто сказати:

```javascript
good("Vasya") // виведе на екран: YOU ARE COOL, Vasya! :-)
```

Команда `return` потрібна для того, щоб функція **повернула** значення туди, звідки вона була викликана. Як `prompt` наприклад. Або синус якогось кута в тригонометрії, теж повертає власне число.

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

console.log(sum(1, 2)); // 3
```

У функції може бути кілька команд return, але комп'ютер закінчить виконання функції при зустрічі першої з них.

```javascript
function sum(a, b) {
    if (a == 0 && b == 0) {
        return 1; // ха-ха
    }
    return a + b;
}

console.log(sum(0, 0)); // що буде?
```

Якщо ж при виклику функції виконана в ній гілка коду не містила ключового слова return, то функція повертає спеціальне значення `undefined`. Можете пошукати про нього в інтернеті.

```javascript
function f() {
  // пусте тіло функції з ім'ям f
}
console.log(f()); // undefined
```

Бувши один раз визначеною, функція може викликатися як завгодно багато разів з різними параметрами, тому функції допомагають не дублювати код і робити його більш гнучким.

```javascript
console.log(sum(2, 3)); // 5
console.log(sum(3, 3)); // 6
console.log(sum(3, 7)); // 10
```

Як аргументи у функцію можна передавати будь-які допустимі в js вирази.

```javascript
console.log(sum(2 + 3, 3)); // 8

let a = 10, b = -10;

console.log(sum(a, b)); // 0
console.log(sum(sum(5, 3), 2)); // 10
```

Тепер з'ясуйте, чому:

```javascript
function wow(b) {
    b = b + 1;
}

let a = 10;
wow(a);
console.log(a); // ??????
```

Щоб перевірити себе, передбачте:

```javascript
function wow(a) {
    a = a + 1;
}

let a = 10;
wow(a);
console.log(a); // ??????
```

Якщо з'ясували чому так, передбачте:

```javascript
function wow(a) {
    a = a + 1;
    return a;
}

let a = 10;
wow(a);
console.log(a); // ??????
```

... вам треба добре розуміти, як працюють функції.

Якщо ви вже пройшли масиви, то читайте наступний блок, інакше можете пропустити:

### Передача масивів у функції

Як ви пам'ятаєте з теми про масиви, коли ми пишемо `A = B` і при цьому `B` це масив, то ми скопіюємо не масив, а тільки посилання на нього, в змінну A. Те ж саме при передачі масиву в функцію — ми передамо посилання на нього, і якщо функція змінить вміст масиву, то ... він зміниться :) Детальніше ви з цим розберетесь тільки після вступу в Ш++, для складання вступного тестування вам ця інформація не знадобиться :)

### Оголошення та виклик функцій

Оголошення — це первинний опис функції. Оголошення == створення.\
Виклик —  це коли, власне, викликаємо функцію будь-де. Виклик == використання.

Все як зі змінними, тільки для оголошення —`function` замість `let`

```javascript
// це оголошення функції myFunction
function myFunction (arg) {
    console.log(arg); // це те, що функція робить (її тіло)
}

myFunction("якийсь текст"); // а це виклик
myFunction(12345); // і це виклик
myFunction(); // і це
```

### Функції в функціях

JavaScript дозволяє створювати функції і в глобальному [скоупі](/zero/tutorials/nagadaiki-poyasnyaiki.md#skoup), так і всередині інших функцій. Причому функції всередині та ззовні можуть навіть мати однакові імена, і це не викликатиме помилку. Чому так — знову ж, читайте про скоупи.

Сильно заморочуватись на цьому поки не варто. Просто знайте, що така можливість є.

Ось код:

```javascript
function foo () {
    console.log("foo");
    function bar () {
        console.log("bar in foo()");
    }
    bar();
}

function bar () {
    console.log("bar");
}

foo();
bar();
```

Закоментуйте по черзі *оголошення* `bar()` — внутрішню, зовнішню та обидві разом.\
Всі три варіанта запустіть і дивіться, що буде. Подумайте, чому саме так.

## **Додаткові матеріали**

[Про функції](https://uk.javascript.info/function-basics) *(uk.javascript.info)*

[Ще про функції](http://xn--80adth0aefm3i.xn--j1amh/function) *(яваскрипт.укр)*

Для вас ми записали власне відео про функції:

{% embed url="<https://www.youtube.com/watch?v=VlQNp2h2pwM>" %}

Вирішили залишити посилання і на це відео, можливо різні підходи допоможуть краще розібратись в темі:

{% embed url="<https://youtu.be/6cKoB5ijaGA>" %}

## Обов'язкові задачі

{% hint style="warning" %}
**Увага!** Тепер і серед обов'язкових задач цього розділу є задачі з Codewars. Тож, якщо ви ще не встигли — саме час розібратись. [Інструкції з Codewars](/zero/tutorials/codewars.md).
{% endhint %}

{% content-ref url="/pages/B1xwwfodRpGdda11CJdk" %}
[Hello world (Codewars)](/zero/tutorials/functions/hello-world-codewars.md)
{% endcontent-ref %}

{% content-ref url="/pages/lkc79waHGcZOHwaMQx5b" %}
[Найбільше число](/zero/tutorials/functions/max-number.md)
{% endcontent-ref %}

{% content-ref url="/pages/0DWRiubjMAOOmyJEcbLU" %}
[Масив у зворотному порядку](/zero/tutorials/functions/array-reversing.md)
{% endcontent-ref %}

*Виникли питання або труднощі?* [*Зверніться за допомогою до Ш++.*](/zero/arrangements/support.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shpp.gitbook.io/zero/tutorials/functions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
