Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 252bb09

Browse files
Merge pull request #710 from Andrii256/01-06-03-closure
Fix closure (01-06-03)
2 parents c71b7f4 + e615377 commit 252bb09

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

‎1-js/06-advanced-functions/03-closure/article.md‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ JavaScript -- це дуже функціонально орієнтована м
55

66
Ми вже знаємо, що функція може отримати доступ до змінних з зовнішнього середовища (зовнішні змінні).
77

8-
Але що станеться, якщо зовнішні змінні змінюються після створення функції? Чи отримає функція нові значення чи старі?
8+
Але що станеться, якщо зовнішні змінні зміняться після створення функції? Функція отримає нові значення чи старі?
99

1010
А що буде, коли функція передається як параметр і викликається з іншого місця коду, чи отримає вона доступ до зовнішніх змінних на новому місці?
1111

1212
Давайте розширимо наші знання, щоб зрозуміти ці та більш складні сценарії.
1313

1414
```smart header="Тут ми поговоримо про змінні `let/const`"
15-
У JavaScript існує 3 способи оголошення змінної: `let`, `const` (сучасні способи) та `var` (залишок минулого).
15+
У JavaScript існує 3 способи оголошення змінної: `let`, `const` (сучасні способи) та `var` (застарілий).
1616

1717
- У цій статті ми будемо використовувати `let` для змінних у прикладах.
18-
- Змінні, оголошені через `const`, поводяться так само, тому ця стаття також стосується `const`.
18+
- Змінні, оголошені через `const`, в цих аспектах поводяться так само, тому ця стаття також стосується `const`.
1919
- `var` має деякі помітні відмінності, вони будуть розглянуті в статті <info:var>.
2020
```
2121
@@ -29,15 +29,15 @@ JavaScript -- це дуже функціонально орієнтована м
2929
{
3030
// тут виконується певна робота з локальними змінними, яку не слід бачити зовні
3131
32-
let message = "Привіт"; // змінна видима тільки у цьому блоці
32+
let message = "Привіт"; // змінна, яка буде видима тільки у цьому блоці
3333
3434
alert(message); // Привіт
3535
}
3636
37-
alert(message); // Помилка: змінну message не було оголошено
37+
alert(message); // ReferenceError: message is not defined
3838
```
3939

40-
Ми можемо використовувати це, щоб виділити фрагмент коду, який працює зі змінними, які доступні лише з нього:
40+
Ми можемо використовувати це, щоб ізолювати фрагмент коду разом із змінними, які стосуються лише його:
4141

4242
```js run
4343
{
@@ -78,7 +78,7 @@ if (true) {
7878
alert(phrase); // Привіт!
7979
}
8080

81-
alert(phrase); // Помилка, такої змінної немає!
81+
alert(phrase); // Помилка, за межами if такої змінної немає!
8282
```
8383

8484
Тут, після завершення `if`, `alert` нижче не побачить `phrase`, отже, помилка.
@@ -100,7 +100,7 @@ alert(i); // Помилка, такої змінної немає
100100

101101
## Вкладені функції
102102

103-
Функція називається "вкладеною", коли вона створюється всередині іншої функції.
103+
Функція називається "вкладеною" (з англ. nested), коли вона створюється всередині іншої функції.
104104

105105
З JavaScript це зробити дуже легко.
106106

@@ -164,10 +164,10 @@ alert( counter() ); // 2
164164

165165
Об’єкт лексичного середовища складається з двох частин:
166166

167-
1. *Запис середовища (Environment Record)* -- об’єкт, який зберігає всі локальні змінні як властивості (та деяку іншу інформацію, наприклад значення `this`).
167+
1. *Запис середовища (Environment Record)* -- об’єкт, який зберігає всі локальні змінні в якості своїх властивостей (та деяку іншу інформацію, наприклад значення `this`).
168168
2. Посилання на *зовнішнє лексичне середовище*, яке пов’язане із зовнішнім кодом.
169169

170-
**"Змінна" це лише властивість спеціального внутрішнього об’єкта, `Запис середовища (Environment Record)`. "Отримати або змінити змінну" насправді означає "отримати або змінити властивість цього об’єкта".**
170+
**"Змінна" це лише властивість спеціального внутрішнього об’єкта, `Запис середовища (Environment Record)`. "Отримати або змінити змінну" означає "отримати або змінити властивість цього об’єкта".**
171171

172172
У цьому простому коді без функцій є лише одне лексичне середовище:
173173

@@ -199,12 +199,12 @@ alert( counter() ); // 2
199199
```smart header="Лексичне середовище -- це об'єкт специфікації"
200200
"Лексичне середовище" -- це об’єкт специфікації: він існує лише "теоретично" в [специфікації мови](https://tc39.es/ecma262/#sec-lexical-environments) щоб показати, як все працює. Ми не можемо отримати цей об’єкт у нашому коді та керувати ним безпосередньо.
201201
202-
Рушії JavaScript також можуть його оптимізувати, відкидати змінні, які не використовуються для економії пам’яті та виконувати інші внутрішні трюки, доки видима поведінка залишається такою, як описано у специфікації.
202+
Також рушії JavaScript можуть його оптимізовувати, відкидати змінні, які не використовуються для економії пам’яті та виконувати інші внутрішні трюки, доки видима поведінка залишається такою, як описано у специфікації.
203203
```
204204

205205
### 2 етап. Функції створені як Function Declarations
206206

207-
Функція також є значенням, як і значення у змінних.
207+
Функція також є значенням, як і значення всередині змінних.
208208

209209
**Різниця в тому, що функція створена за допомогою Function Declaration, ініціалізується миттєво і повністю.**
210210

@@ -246,12 +246,12 @@ alert( counter() ); // 2
246246

247247
**Коли код хоче отримати доступ до змінної -- спочатку шукає її у внутрішньому лексичному середовищі, потім у зовнішньому, потім у зовнішньому до попереднього і так далі поки не дійде до глобального.**
248248

249-
Якщо змінна ніде не знайдена, то буде помилка для увімкненого суворого режиму (без `use strict`, присвоєння неіснуючої змінної створює нову глобальну змінну для сумісності зі старим кодом).
249+
Якщо змінна ніде не знайдена, то при `"use strict"` буде помилка (без `use strict` присвоєння неіснуючої змінної створює нову глобальну змінну для сумісності зі старим кодом).
250250

251251
У цьому прикладі пошук відбувається наступним чином:
252252

253253
- Для змінної `name`, `alert` у функції `say` знаходить її негайно у внутрішньому лексичному середовищі.
254-
- Коли він хоче отримати доступ до `phrase`, він спочатку шукає її серед локальних змінних, де її немає, і врешті решт іде за посиланням на зовнішнє лексичне середовище і знаходить її там.
254+
- Коли вона хоче отримати доступ до `phrase`, вона спочатку шукає її серед локальних змінних, де її немає, і врешті решт іде за посиланням на зовнішнє лексичне середовище і знаходить її там.
255255

256256
![lexical environment lookup](lexical-environment-simple-lookup.svg)
257257

@@ -278,7 +278,7 @@ let counter = makeCounter();
278278

279279
![](closure-makecounter.svg)
280280

281-
Різниця полягає в тому, що під час виконання `makeCounter()`, крихітна вкладена функція створюється, яка складається лише з одного рядка: `return count++`. Ми не запускаємо її, лише створюємо.
281+
Різниця полягає в тому, що під час виконання `makeCounter()`, створюється крихітна вкладена функція, яка складається лише з одного рядка: `return count++`. Ми не запускаємо її, лише створюємо.
282282

283283
Усі функції пам’ятають лексичне середовище, в якому вони були створені. Технічно тут немає ніякої магії: усі функції мають приховану властивість з назвою `[[Environment]]`, що зберігає посилання на лексичне середовище, де була створена функція:
284284

@@ -371,7 +371,7 @@ g = null; // ...і тепер пам’ять очищена
371371

372372
Але на практиці рушії JavaScript намагаються оптимізувати це. Вони аналізують використання змінних, і якщо з коду очевидно, що зовнішня змінна не використовується -- вона видаляється.
373373

374-
**Важливим побічним ефектом у рушію V8 (Chrome, Edge, Opera) є те, що така змінна стане недоступною під час налагодження.**
374+
**Важливим побічним ефектом у рушія V8 (Chrome, Edge, Opera) є те, що така змінна стане недоступною під час налагодження.**
375375

376376
Спробуйте запустити наведений нижче приклад у Chrome із відкритими інструментами розробника.
377377

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /