JavaScript Closures चे स्पष्टीकरण

तुम्ही JavaScript मध्ये दररोज closures वापरता. तुम्ही बहुधा ते React hooks, event listeners आणि Node.js callbacks मध्ये वापरत असाल. अनेक डेव्हलपर्सना सिद्धांतामध्ये (theory) अडचण येते, परंतु एकदा का तुम्हाला तो पॅटर्न समजला की ही संकल्पना सोपी आहे.

Closures समजून घेण्यासाठी, तुम्हाला lexical scope समजून घेणे आवश्यक आहे.

Lexical scope म्हणजे एखादे function त्याच्या स्वतःच्या scope मधून आणि ज्या outer scope मध्ये ते परिभाषित (defined) केले आहे, तिथून variables ॲक्सेस करू शकते. हे तुम्ही कोड कुठे लिहिता यावर अवलंबून असते, तो कोड कुठे कॉल केला जातो यावर नाही.

Closure म्हणजे असे function जे त्याचा मूळ scope संपल्यानंतरही त्यातील variables लक्षात ठेवते.

एका 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 सेटअप function मधील डेटा लक्षात ठेवतो. सेटअप function संपल्यानंतरही, listener तो डेटा जपून ठेवतो.

  • React Hooks: प्रत्येक वेळी जेव्हा तुम्ही useState किंवा useEffect वापरता, तेव्हा तुम्ही closures वापरत असता. React मध्ये एक सामान्य bug तेव्हा येतो जेव्हा closure state ची जुनी value कॅप्चर करते. याला 'stale closure' असे म्हणतात.

मेमरी वापराकडे (memory usage) लक्ष द्या. Closure मुळे variables चा live reference कायम राहतो, त्यामुळे जोपर्यंत closure अस्तित्वात आहे, तोपर्यंत engine त्यांना garbage collection द्वारे काढून टाकू शकत नाही. जर तुम्हाला मोठ्या objects ची दीर्घकाळ गरज नसेल, तर त्यांना closure मध्ये ठेवणे टाळा.

सारांश:

  • Lexical scope ॲक्सेस परिभाषित करते.
  • Closures तो ॲक्सेस कायमस्वरूपी (persistent) बनवतात.
  • एक function त्याच्या वातावरणाला बॅकपॅकमध्ये घेऊन जाते.
  • scoping bugs टाळण्यासाठी loops मध्ये var ऐवजी let वापरा.

स्रोत: https://dev.to/digitalunicon/javascript-closures-explained-with-examples-339f