𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗖𝗹𝗼𝘀𝘂𝗿𝗲𝘀 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱 (JavaScript Closures की व्याख्या)
आप JavaScript में हर दिन closures का उपयोग करते हैं। आप संभवतः इनका उपयोग React hooks, event listeners, और Node.js callbacks में करते हैं। कई डेवलपर्स इसके सिद्धांत (theory) को समझने में संघर्ष करते हैं, लेकिन एक बार जब आप पैटर्न देख लेते हैं, तो यह अवधारणा (concept) सरल हो जाती है।
Closures को समझने के लिए, आपको lexical scope को समझना होगा।
Lexical scope का अर्थ है कि एक function अपने स्वयं के scope और किसी भी बाहरी scope से variables को access कर सकता है जहाँ उसे define किया गया था। यह इस पर निर्भर करता है कि आप कोड कहाँ लिखते हैं, न कि इस पर कि आप उसे कहाँ call करते हैं।
A closure एक ऐसा function है जो अपने मूल scope के variables को तब भी याद रखता है जब वह scope चलना बंद कर देता है।
एक function को एक बैकपैक (backpack) ले जाने वाले के रूप में सोचें। जब function बनाया जाता है, तो यह अपने environment से आवश्यक प्रत्येक variable को उस बैकपैक में पैक कर लेता है। function उस बैकपैक को हर जगह अपने साथ ले जाता है।
यहाँ बताया गया है कि व्यावहारिक रूप से closures कैसे काम करते हैं:
Private Variables: आप बाहरी दुनिया से डेटा छिपा सकते हैं। बैंक खाते के उदाहरण में, balance variable private रहता है। आप इसे केवल deposit या withdraw जैसे विशिष्ट methods के माध्यम से ही बदल सकते हैं। यह संवेदनशील डेटा तक सीधी पहुँच को रोकता है।
Function Factories: आप ऐसे functions बना सकते हैं जो अन्य functions उत्पन्न करते हैं। एक multiplier factory एक double function या triple function बना सकती है। प्रत्येक नया function अपने बैकपैक में अपना विशिष्ट multiplier रखता है।
Event Listeners: जब आप किसी बटन पर click event लगाते हैं, तो handler setup function के डेटा को याद रखता है। सेटअप function समाप्त होने के बाद भी, listener उस डेटा को अपने पास रखता है।
React Hooks: हर बार जब आप useState या useEffect का उपयोग करते हैं, तो आप closures का उपयोग कर रहे होते हैं। React में एक सामान्य bug तब होता है जब एक closure state के पुराने value को capture कर लेता है। इसे stale closure कहा जाता है।
मेमोरी उपयोग (memory usage) का ध्यान रखें। क्योंकि एक closure variables का एक live reference रखता है, इसलिए जब तक closure मौजूद है, engine garbage collection के माध्यम से उन्हें साफ नहीं कर सकता। यदि आपको लंबे समय तक उनकी आवश्यकता नहीं है, तो closure में भारी objects रखने से बचें।
सारांश:
- Lexical scope access को परिभाषित करता है।
- Closures उस access को स्थायी (persistent) बनाते हैं।
- एक function अपने environment को एक बैकपैक में ले जाता है।
- scoping bugs से बचने के लिए loops में var के बजाय let का उपयोग करें।
Source: https://dev.to/digitalunicon/javascript-closures-explained-with-examples-339f