Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix functions expressions #687

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions 1-js/02-first-steps/16-function-expressions/article.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Функціональні вирази

Для JavaScript функція — це не "магічна мовна структура", а значення особливого ґатунку.
Для JavaScript функція — це не "магічна мовна структура", а значення. Просто не звичайне, а особливе.

Синтаксис, що ми раніше використовували, називається [*Оголошення Функції*](https://developer.mozilla.org/uk/docs/Web/JavaScript/Guide/Functions#Оголошення_функції) (Function Declaration):
Синтаксис, що ми раніше використовували, називається [*Оголошенням Функції*](https://developer.mozilla.org/uk/docs/Web/JavaScript/Guide/Functions#Оголошення_функції) (Function Declaration):

```js
function sayHi() {
Expand Down Expand Up @@ -34,7 +34,7 @@ let sayHi = function() {

## Функція -- це значення

Повторімо: немає значення, яким чином створено функцію, функція -- це завжди значення. В обох прикладах вище, функція зберігається в змінній `sayHi`.
Повторімо: незалежно від того яким чином створено функцію, всеодно функція -- це завжди значення. В обох прикладах вище, функція зберігається в змінній `sayHi`.

Ми навіть можемо вивести це значення, використовуючи `alert`:

Expand All @@ -52,9 +52,9 @@ alert( sayHi ); // показує код функції

У JavaScript функція — це значення, тому ми можемо поводитись з нею, як і з іншими значеннями. Код вище показує її рядкове представлення — вихідний код.

Звичайно, функція — особливе значення, у тому сенсі, що ми можемо здійснити її виклик за допомогою дужок: `sayHi()`.
Звичайно, функція — особливе значення. Особливе тим, що ми можемо здійснити її виклик за допомогою дужок: `sayHi()`.

Але це все-таки значення. Тому ми можемо працювати з нею, як і з іншими значеннями.
Але це всеодно значення. Тому ми можемо працювати з нею, як і з іншими значеннями.

Скажімо, ми можемо скопіювати функцію в іншу змінну:

Expand All @@ -75,7 +75,7 @@ sayHi(); // Привіт // ось так теж спрацює (а чо
2. Рядок `(2)` копіює це значення в змінну `func`. Ще раз зауважте: після `sayHi` немає дужок. Якби вони там були, тоді `func = sayHi()` записав би *результат виклику* `sayHi()` у `func`, а не *саму функцію* `sayHi`.
3. Тепер ми можемо викликати функцію двома шляхами: `sayHi()` або `func()`.

Також ми могли використати Функціональний Вираз у першому рядку, щоб визначити `sayHi`:
Також ми могли використати Функціональний Вираз у першому рядку, щоб оголосити `sayHi`:

```js
let sayHi = function() { // (1) створити
Expand Down Expand Up @@ -144,7 +144,7 @@ function showCancel() {
ask("Ви згодні?", showOk, showCancel);
```

Такі функції є досить практичними. Головна відмінність між функцією `ask` у реальних програмах та прикладі вище, полягає в тому, що перша може використовувати складніші способи взаємодії з користувачем, ніж звичайний `confirm`. У браузерах така функція зазвичай показує гарненьке модальне вікно з запитанням. Але це вже інша історія.
Такі функції є досить практичними. Головна відмінність між функцією `ask` у реальних програмах та в прикладі вище, полягає в тому, що перша може використовувати складніші способи взаємодії з користувачем, ніж звичайний `confirm`. У браузерах така функція зазвичай показує гарненьке модальне вікно з запитанням. Але це вже інша історія.

**Аргументи `showOk` та `showCancel` функції `ask` називаються *функціями зворотного виклику* або просто *колбеками*.**

Expand All @@ -167,7 +167,7 @@ ask(
*/!*
```

У цьому прикладі функції оголошені всередині виклику `ask(...)`. Вони не мають власного ім'я, тому називаються *анонімними*. До таких функцій не можна доступитись поза `ask` (бо вони не присвоєні змінним), але це саме те, що нам потрібно.
У цьому прикладі функції оголошені всередині виклику `ask(...)`. Вони не мають власного ім'я, тому називаються *анонімними*. Ці функції не можна викликати за межами `ask` (бо вони не присвоєні змінним), але це саме те, що нам потрібно.

Подібний код, що з'явився в нашому скрипті є природним, в дусі JavaScript.

Expand All @@ -194,7 +194,7 @@ ask(
return a + b;
}
```
- *Функціональний Вираз:* функція створюється як частина іншого виразу чи синтаксичної конструкції. Нижче, створення функції відбувається в правій частині "виразу присвоєння" `=`:
- *Функціональний Вираз:* функція створюється як частина іншого виразу чи синтаксичної конструкції. Нижче, створення функції відбувається в правій частині "виразу присвоєння", тобто після `=`:

```js
// Функціональний Вираз
Expand Down Expand Up @@ -249,9 +249,9 @@ let sayHi = function(name) { // (*) більше ніякої магії

Ще однією особливістю Оголошення Функції є її блокова область видимості.

**У суворому режимі, якщо Оголошення Функції знаходиться в блоці `{...}`, то функція доступна усюди всередині блоку. Але не зовні.**
**У [суворому режимі](info:strict-mode), якщо Оголошення Функції знаходиться в блоці `{...}`, то функція доступна усюди всередині блоку. Але не зовні.**

Уявімо, що нам потрібно визначити функцію `welcome()` залежно від змінної `age`, яку ми отримаємо під час виконання коду. Далі в скрипті нам буде потрібно викликати цю функцію.
Уявімо, що нам потрібно визначити функцію `welcome()` опираючись на значення змінної `age`, яку ми отримаємо під час виконання коду. Далі в скрипті нам буде потрібно викликати цю функцію.

Якщо ми використаємо Оголошення Функції, то це не буде працювати:

Expand Down Expand Up @@ -360,7 +360,7 @@ welcome(); // спрацює


```smart header="Коли використовувати Оголошення Функції, а коли -- Функціональний Вираз?"
Зазвичай, коли нам потрібна функція, то найперше потрібно розглянути синтаксис Оголошення Функції. Він дає нам більше свободи у тому, як організовувати код, оскільки дозволяє викликати функції ще до їх визначення.
Зазвичай краще надавати перевагу синтаксису Оголошення Функції. Він дає нам більше свободи у тому, як організовувати код, оскільки дозволяє викликати функції ще до їх визначення.

Також функції `function f(…) {…}` простіше помітити в коді, ніж `let f = function(…) {…};`. Оголошення Функції легше "ловляться очима".

Expand Down