diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 8024870bc..13efbb1f0 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -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() { @@ -34,7 +34,7 @@ let sayHi = function() { ## Функція -- це значення -Повторімо: немає значення, яким чином створено функцію, функція -- це завжди значення. В обох прикладах вище, функція зберігається в змінній `sayHi`. +Повторімо: незалежно від того яким чином створено функцію, всеодно функція -- це завжди значення. В обох прикладах вище, функція зберігається в змінній `sayHi`. Ми навіть можемо вивести це значення, використовуючи `alert`: @@ -52,9 +52,9 @@ alert( sayHi ); // показує код функції У JavaScript функція — це значення, тому ми можемо поводитись з нею, як і з іншими значеннями. Код вище показує її рядкове представлення — вихідний код. -Звичайно, функція — особливе значення, у тому сенсі, що ми можемо здійснити її виклик за допомогою дужок: `sayHi()`. +Звичайно, функція — особливе значення. Особливе тим, що ми можемо здійснити її виклик за допомогою дужок: `sayHi()`. -Але це все-таки значення. Тому ми можемо працювати з нею, як і з іншими значеннями. +Але це всеодно значення. Тому ми можемо працювати з нею, як і з іншими значеннями. Скажімо, ми можемо скопіювати функцію в іншу змінну: @@ -75,7 +75,7 @@ sayHi(); // Привіт // ось так теж спрацює (а чо 2. Рядок `(2)` копіює це значення в змінну `func`. Ще раз зауважте: після `sayHi` немає дужок. Якби вони там були, тоді `func = sayHi()` записав би *результат виклику* `sayHi()` у `func`, а не *саму функцію* `sayHi`. 3. Тепер ми можемо викликати функцію двома шляхами: `sayHi()` або `func()`. -Також ми могли використати Функціональний Вираз у першому рядку, щоб визначити `sayHi`: +Також ми могли використати Функціональний Вираз у першому рядку, щоб оголосити `sayHi`: ```js let sayHi = function() { // (1) створити @@ -144,7 +144,7 @@ function showCancel() { ask("Ви згодні?", showOk, showCancel); ``` -Такі функції є досить практичними. Головна відмінність між функцією `ask` у реальних програмах та прикладі вище, полягає в тому, що перша може використовувати складніші способи взаємодії з користувачем, ніж звичайний `confirm`. У браузерах така функція зазвичай показує гарненьке модальне вікно з запитанням. Але це вже інша історія. +Такі функції є досить практичними. Головна відмінність між функцією `ask` у реальних програмах та в прикладі вище, полягає в тому, що перша може використовувати складніші способи взаємодії з користувачем, ніж звичайний `confirm`. У браузерах така функція зазвичай показує гарненьке модальне вікно з запитанням. Але це вже інша історія. **Аргументи `showOk` та `showCancel` функції `ask` називаються *функціями зворотного виклику* або просто *колбеками*.** @@ -167,7 +167,7 @@ ask( */!* ``` -У цьому прикладі функції оголошені всередині виклику `ask(...)`. Вони не мають власного ім'я, тому називаються *анонімними*. До таких функцій не можна доступитись поза `ask` (бо вони не присвоєні змінним), але це саме те, що нам потрібно. +У цьому прикладі функції оголошені всередині виклику `ask(...)`. Вони не мають власного ім'я, тому називаються *анонімними*. Ці функції не можна викликати за межами `ask` (бо вони не присвоєні змінним), але це саме те, що нам потрібно. Подібний код, що з'явився в нашому скрипті є природним, в дусі JavaScript. @@ -194,7 +194,7 @@ ask( return a + b; } ``` -- *Функціональний Вираз:* функція створюється як частина іншого виразу чи синтаксичної конструкції. Нижче, створення функції відбувається в правій частині "виразу присвоєння" `=`: +- *Функціональний Вираз:* функція створюється як частина іншого виразу чи синтаксичної конструкції. Нижче, створення функції відбувається в правій частині "виразу присвоєння", тобто після `=`: ```js // Функціональний Вираз @@ -249,9 +249,9 @@ let sayHi = function(name) { // (*) більше ніякої магії Ще однією особливістю Оголошення Функції є її блокова область видимості. -**У суворому режимі, якщо Оголошення Функції знаходиться в блоці `{...}`, то функція доступна усюди всередині блоку. Але не зовні.** +**У [суворому режимі](info:strict-mode), якщо Оголошення Функції знаходиться в блоці `{...}`, то функція доступна усюди всередині блоку. Але не зовні.** -Уявімо, що нам потрібно визначити функцію `welcome()` залежно від змінної `age`, яку ми отримаємо під час виконання коду. Далі в скрипті нам буде потрібно викликати цю функцію. +Уявімо, що нам потрібно визначити функцію `welcome()` опираючись на значення змінної `age`, яку ми отримаємо під час виконання коду. Далі в скрипті нам буде потрібно викликати цю функцію. Якщо ми використаємо Оголошення Функції, то це не буде працювати: @@ -360,7 +360,7 @@ welcome(); // спрацює ```smart header="Коли використовувати Оголошення Функції, а коли -- Функціональний Вираз?" -Зазвичай, коли нам потрібна функція, то найперше потрібно розглянути синтаксис Оголошення Функції. Він дає нам більше свободи у тому, як організовувати код, оскільки дозволяє викликати функції ще до їх визначення. +Зазвичай краще надавати перевагу синтаксису Оголошення Функції. Він дає нам більше свободи у тому, як організовувати код, оскільки дозволяє викликати функції ще до їх визначення. Також функції `function f(…) {…}` простіше помітити в коді, ніж `let f = function(…) {…};`. Оголошення Функції легше "ловляться очима".