Замикання (програмування): відмінності між версіями

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
BunykBot (обговорення | внесок)
м заміна застарілого тегу source
Трохи інтервікі, мова, без джерел...
Рядок 1:
{{Без джерел}}
У [[програмування|програмуванні]], '''замиканням''' ({{lang-en|closure}}) називають [[підпрограма|підпрограму]], що виконується в середовищі, яке містить одну або більше [[зв'язана змінна|зв'язаних змінних]]. Підпрограма має доступ до цих змінних під час виконання.
 
Застосування замикань асоціюється з [[функціональне програмування|функціональним програмуванням]]. У функціональному програмуванні за допомогою замикань можуть моделюватись такі конструкції, як [[Об'єкт (програмування)|об'єкти]] в інших мовах програмування, .
 
У деяких мовах програмування{{яких}} замикання створюється для підпрограм, що визначені всередині інших підпрограм, і [[вкладена функція|внутрішня підпрограма]] має доступ до локальних змінних зовнішньої. Під час виконання, коли обчислюється зовнішня підпрограма, утворюється замикання, до якого потрапляє код внутрішньої підпрограми, та посилання на ті змінні зовнішньої підпрограми, що використовуються у внутрішній підпрограмі. Посилання на змінні зовнішньої підпрограми залишаються дійсними всередині вкладеної внутрішньої підпрограми доти, поки існує ця вкладена підпрограма, навіть якщо зовнішня підпрограма завершила виконання і вийшла з області видимості. Концепцію замикань було повністю розроблено в [[1960-ті]] роки та реалізовано як особливість мови програмування [[Scheme (мова програмування)|Scheme]]. Відтоді було розроблено багато мов програмування з підтримкою замикань.
 
== Приклад реалізації на [[Lua]] ==
<syntaxhighlight lang="lua">
function addfunc(x)
return function(y) -- Повертає нову функцію без назви, яка додає x до аргументу
return x + y -- Коли ми будемо посилатися на змінну x, що знаходиться поза даною областю й існування якої менше ніж даної безіменної функції,
-- Lua створить замикання
end
end
Рядок 18 ⟶ 20:
 
== Приклад на [[JavaScript]] ==
Функції (зокрема в JS) можна зобразити як спеціальні об'єкти, що включають код, який можна запускати, а також властивості. Кожна функція має властивість <code>[scope]</code>, котра відображає оточення на момент створення функції. Якщо ж функцію створено викликом з іншої функції, тоді це відображення старого оточення «перекривається» нової функцією і це називається замиканням.

<syntaxhighlight lang="javascript">
const myClosure = (function outerFunction() {
let hidden = 1;
Рядок 38 ⟶ 42:
 
=== Створення замикання в JavaScript ===
Усі функції в JavaScript&nbsp;— це замикання; коли задається функція&nbsp;— задається замикання. Так що замикання створюється при визначенні функції. Але треба розуміти різницю між створенням замикання і створенням нового scope-об'єкту: замикання<ref>{{Cite web | url = https://howtonode.org/object-graphs | title = Learning Javascript with Object Graphs - How To Node - NodeJS | website = howtonode.org |accessdate=2016-04 access-date = 24 квітня 2016}}</ref> (функція + посилання на поточний ланцюжок scope-об'єктів) створюється при визначенні функції, але новий scope-об'єкт створюється (і використовується для модифікації ланцюжка scope-об'єктів замикання) при виклику функції.
 
=== Видалення&nbsp; замикання ===
Як[[Збирання сміття|Збірник сміття]] обробляє і видаляє замикання, як і будь-який інший об'єкт у JavaScript. Збірник сміття обробляє і видаляє замикання, коли на нього більше немає посилань.
 
== Примітки ==