Ця стаття не містить . (березень 2021) |
У програмуванні замиканням (англ. closure) називають підпрограму, що виконується в середовищі, яке містить одну або більше []. Підпрограма має доступ до цих змінних під час виконання.
Застосування замикань асоціюється з функційним програмуванням. У функціональному програмуванні за допомогою замикань можуть моделюватись такі конструкції, як об'єкти в інших мовах програмування.
У деяких мовах програмування[] замикання створюється для підпрограм, що визначені всередині інших підпрограм, і внутрішня підпрограма має доступ до локальних змінних зовнішньої. Під час виконання, коли обчислюється зовнішня підпрограма, утворюється замикання, до якого потрапляє код внутрішньої підпрограми, та посилання на ті змінні зовнішньої підпрограми, що використовуються у внутрішній підпрограмі. Посилання на змінні зовнішньої підпрограми залишаються дійсними всередині вкладеної внутрішньої підпрограми доти, поки існує ця вкладена підпрограма, навіть якщо зовнішня підпрограма завершила виконання і вийшла з області видимості. Концепцію замикань було повністю розроблено в 1960-ті роки та реалізовано як особливість мови програмування Scheme. Відтоді було розроблено багато мов програмування з підтримкою замикань.
Приклад реалізації на Lua
function addfunc(x) return function(y) -- Повертає нову функцію без назви, яка додає x до аргументу return x + y -- Коли ми будемо посилатися на змінну x, що знаходиться поза даною областю й існування якої менше ніж даної безіменної функції, -- Lua створить замикання end end num_plus = addfunc(2) -- Тепер num_plus - функція, в якій замість x підставлено 2 print(num_plus(5)) -- В результаті буде виведено 7
Приклад на JavaScript
Функції (зокрема в JS) можна зобразити як спеціальні об'єкти, що включають код, який можна запускати, а також властивості. Кожна функція має властивість [scope]
, котра відображає оточення на момент створення функції. Якщо ж функцію створено викликом з іншої функції, тоді це відображення старого оточення «перекривається» нової функцією і це називається замиканням.
const myClosure = (function outerFunction() { let hidden = 1; return { innerFunction() { return hidden++; } }; }()); myClosure.innerFunction(); // повертає 1 myClosure.innerFunction(); // повертає 2 myClosure.innerFunction(); // повертає 3
Коли JS-код працює, локальні змінні зберігаються в scope. В JavaScript локальні змінні можуть лишатись в пам'яті навіть після того, як функція повернула значення.
Створення замикання в JavaScript
Усі функції в JavaScript — це замикання; коли задається функція — задається замикання. Так що замикання створюється при визначенні функції. Але треба розуміти різницю між створенням замикання і створенням нового scope-об'єкту: замикання (функція + посилання на поточний ланцюжок scope-об'єктів) створюється при визначенні функції, але новий scope-об'єкт створюється (і використовується для модифікації ланцюжка scope-об'єктів замикання) при виклику функції.
Видалення замикання
Збірник сміття обробляє і видаляє замикання, як і будь-який інший об'єкт у JavaScript, коли на нього більше немає посилань.
Примітки
- . howtonode.org. Архів оригіналу за 27 грудня 2016. Процитовано 24 квітня 2016.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2021 U programuvanni zamikannyam angl closure nazivayut pidprogramu sho vikonuyetsya v seredovishi yake mistit odnu abo bilshe sho ce Pidprograma maye dostup do cih zminnih pid chas vikonannya Zastosuvannya zamikan asociyuyetsya z funkcijnim programuvannyam U funkcionalnomu programuvanni za dopomogoyu zamikan mozhut modelyuvatis taki konstrukciyi yak ob yekti v inshih movah programuvannya U deyakih movah programuvannya yakih zamikannya stvoryuyetsya dlya pidprogram sho viznacheni vseredini inshih pidprogram i vnutrishnya pidprograma maye dostup do lokalnih zminnih zovnishnoyi Pid chas vikonannya koli obchislyuyetsya zovnishnya pidprograma utvoryuyetsya zamikannya do yakogo potraplyaye kod vnutrishnoyi pidprogrami ta posilannya na ti zminni zovnishnoyi pidprogrami sho vikoristovuyutsya u vnutrishnij pidprogrami Posilannya na zminni zovnishnoyi pidprogrami zalishayutsya dijsnimi vseredini vkladenoyi vnutrishnoyi pidprogrami doti poki isnuye cya vkladena pidprograma navit yaksho zovnishnya pidprograma zavershila vikonannya i vijshla z oblasti vidimosti Koncepciyu zamikan bulo povnistyu rozrobleno v 1960 ti roki ta realizovano yak osoblivist movi programuvannya Scheme Vidtodi bulo rozrobleno bagato mov programuvannya z pidtrimkoyu zamikan Priklad realizaciyi na Luafunction addfunc x return function y Povertaye novu funkciyu bez nazvi yaka dodaye x do argumentu return x y Koli mi budemo posilatisya na zminnu x sho znahoditsya poza danoyu oblastyu j isnuvannya yakoyi menshe nizh danoyi bezimennoyi funkciyi Lua stvorit zamikannya end end num plus addfunc 2 Teper num plus funkciya v yakij zamist x pidstavleno 2 print num plus 5 V rezultati bude vivedeno 7Priklad na JavaScriptFunkciyi zokrema v JS mozhna zobraziti yak specialni ob yekti sho vklyuchayut kod yakij mozhna zapuskati a takozh vlastivosti Kozhna funkciya maye vlastivist scope kotra vidobrazhaye otochennya na moment stvorennya funkciyi Yaksho zh funkciyu stvoreno viklikom z inshoyi funkciyi todi ce vidobrazhennya starogo otochennya perekrivayetsya novoyi funkciyeyu i ce nazivayetsya zamikannyam const myClosure function outerFunction let hidden 1 return innerFunction return hidden myClosure innerFunction povertaye 1 myClosure innerFunction povertaye 2 myClosure innerFunction povertaye 3 Koli JS kod pracyuye lokalni zminni zberigayutsya v scope V JavaScript lokalni zminni mozhut lishatis v pam yati navit pislya togo yak funkciya povernula znachennya Stvorennya zamikannya v JavaScript Usi funkciyi v JavaScript ce zamikannya koli zadayetsya funkciya zadayetsya zamikannya Tak sho zamikannya stvoryuyetsya pri viznachenni funkciyi Ale treba rozumiti riznicyu mizh stvorennyam zamikannya i stvorennyam novogo scope ob yektu zamikannya funkciya posilannya na potochnij lancyuzhok scope ob yektiv stvoryuyetsya pri viznachenni funkciyi ale novij scope ob yekt stvoryuyetsya i vikoristovuyetsya dlya modifikaciyi lancyuzhka scope ob yektiv zamikannya pri vikliku funkciyi Vidalennya zamikannya Zbirnik smittya obroblyaye i vidalyaye zamikannya yak i bud yakij inshij ob yekt u JavaScript koli na nogo bilshe nemaye posilan Primitki howtonode org Arhiv originalu za 27 grudnya 2016 Procitovano 24 kvitnya 2016