Замикання (програмування): відмінності між версіями
[перевірена версія] | [перевірена версія] |
Вилучено вміст Додано вміст
м заміна застарілого тегу source |
Емартіс (обговорення | внесок) Трохи інтервікі, мова, без джерел... |
||
Рядок 1:
{{Без джерел}}
У [[програмування|програмуванні]]
Застосування замикань асоціюється з [[функціональне програмування|функціональним програмуванням]]. У функціональному програмуванні за допомогою замикань можуть моделюватись такі конструкції, як [[Об'єкт (програмування)|об'єкти]] в інших мовах програмування
У деяких мовах програмування{{яких}} замикання створюється для підпрограм, що визначені всередині інших підпрограм, і [[вкладена функція|внутрішня підпрограма]] має доступ до локальних змінних зовнішньої. Під час виконання, коли обчислюється зовнішня підпрограма, утворюється замикання, до якого потрапляє код внутрішньої підпрограми, та посилання на ті змінні зовнішньої підпрограми, що використовуються у внутрішній підпрограмі. Посилання на змінні зовнішньої підпрограми залишаються дійсними всередині вкладеної внутрішньої підпрограми доти, поки існує ця вкладена підпрограма, навіть якщо зовнішня підпрограма завершила виконання і вийшла з області видимості. Концепцію замикань було повністю розроблено в [[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 — це замикання; коли задається функція — задається замикання. Так що замикання створюється при визначенні функції. Але треба розуміти різницю між створенням замикання і створенням нового scope-об'єкту: замикання<ref>{{Cite web | url = https://howtonode.org/object-graphs | title = Learning Javascript with Object Graphs - How To Node - NodeJS | website = howtonode.org |
=== Видалення
== Примітки ==
|