टाइपस्क्रिप्ट में क्लोज़र
इस लेख में, हम टाइपस्क्रिप्ट में क्लोज़र को समझाएंगे।
YouTube Video
टाइपस्क्रिप्ट में क्लोज़र
क्लोज़र क्या है?
क्लोज़र उस क्षमता को संदर्भित करता है जिसमें एक फ़ंक्शन को परिभाषित किए गए स्कोप (पर्यावरण) को संदर्भित करने की अनुमति है, चाहे उस स्कोप के बाहर फ़ंक्शन को कॉल किया जाए। नीचे, टाइप एनोटेशन सहित क्लोज़र की व्याख्या की जाएगी।
सरल शब्दों में, एक क्लोज़र एक फ़ंक्शन और उस पर्यावरण को जोड़ता है जहां फ़ंक्शन को परिभाषित किया गया था, जिससे उस पर्यावरण तक पहुँचने की अनुमति मिलती है जब फ़ंक्शन को कॉल किया जाता है।
क्लोज़र की मूलभूत कार्य प्रणाली
टाइपस्क्रिप्ट में, जब एक फ़ंक्शन को दूसरे फ़ंक्शन के भीतर परिभाषित किया जाता है, तो यह स्पष्ट हो जाता है कि आंतरिक फ़ंक्शन बाहरी फ़ंक्शन के वेरिएबल्स को एक्सेस कर सकता है। यहां टाइप एनोटेशन के साथ क्लोज़र का एक बुनियादी उदाहरण है।
1function outerFunction(): () => void {
2 let outerVariable: string = "I am from outer function";
3
4 function innerFunction(): void {
5 // The inner function accesses the variable of the outer function
6 console.log(outerVariable);
7 }
8
9 return innerFunction;
10}
11
12const closure: () => void = outerFunction();
13closure(); // "I am from outer function"
outerFunction
का रिटर्न प्रकार() => void
है, जो यह दर्शाता है कि यह एक फ़ंक्शन लौटाता है।innerFunction
प्रकार को स्पष्ट रूप सेvoid
पर सेट किया गया है, जो यह बताता है कि इसका कोई रिटर्न मान नहीं है।
क्लोज़र का उपयोग और लाभ
डेटा कैप्सुलेशन
डेटा कैप्सुलेशन के लिए टाइप एनोटेशन के साथ क्लोज़र का एक उदाहरण नीचे दिया गया है।
1function createCounter(): () => number {
2 let count: number = 0;
3
4 return function (): number {
5 count += 1;
6 return count;
7 };
8}
9
10const counter: () => number = createCounter();
11console.log(counter()); // 1
12console.log(counter()); // 2
13console.log(counter()); // 3
createCounter
फ़ंक्शन() => number
प्रकार का एक फ़ंक्शन लौटाता है।count
वेरिएबल कोnumber
प्रकार के रूप में परिभाषित किया गया है और यह क्लोज़र के भीतर हेरफेर किया जाता है।
उच्च-क्रम फ़ंक्शन
क्लोज़र उच्च-क्रम के फ़ंक्शन बनाने में उपयोगी होते हैं। स्पष्ट टाइप एनोटेशन के साथ उच्च-क्रम के फ़ंक्शन का एक उदाहरण नीचे है।
1function createMultiplier(multiplier: number): (value: number) => number {
2 return function (value: number): number {
3 return value * multiplier;
4 };
5}
6
7const double: (value: number) => number = createMultiplier(2);
8console.log(double(5)); // 10
9
10const triple: (value: number) => number = createMultiplier(3);
11console.log(triple(5)); // 15
createMultiplier
एकnumber
प्रकार का आर्गुमेंट लेता है और(value: number) => number
प्रकार का एक फ़ंक्शन लौटाता है।- आंतरिक फ़ंक्शन भी
value
कोnumber
प्रकार के रूप में स्वीकार करता है और परिणाम कोnumber
प्रकार के रूप में लौटाता है।
टाइपस्क्रिप्ट में क्लोज़र को लागू करने का उदाहरण
प्रकार एनोटेशन के साथ एक क्लोज़र के रूप में एक रेंज-बाउंड काउंटर लागू करें।
1function rangeCounter(min: number, max: number): () => number | string {
2 let count: number = min;
3
4 return function (): number | string {
5 if (count <= max) {
6 return count++;
7 } else {
8 return `Count has exceeded the maximum value: ${max}`;
9 }
10 };
11}
12
13const counter: () => number | string = rangeCounter(1, 5);
14
15console.log(counter()); // 1
16console.log(counter()); // 2
17console.log(counter()); // 3
18console.log(counter()); // 4
19console.log(counter()); // 5
20console.log(counter()); // "Count has exceeded the maximum value: 5"
rangeCounter
फ़ंक्शन एक ऐसा फ़ंक्शन लौटाता है जो या तोnumber
याstring
लौटाता है।- आंतरिक फ़ंक्शन में, यदि
count
max
से अधिक हो जाता है, तो यह एकstring
प्रकार का संदेश वापस करता है; अन्यथा, यह एकnumber
प्रकार लौटाता है।
क्लोज़र्स का उपयोग करते समय सावधानियां
क्लोज़र्स के कारण संभावित मेमोरी लीक
क्लोज़र्स बाहरी स्कोप से वेरिएबल्स को संरक्षित कर सकते हैं, जिससे कभी-कभी मेमोरी लीक हो सकती है। अनावश्यक क्लोज़र्स को स्पष्ट रूप से मेमोरी से रिलीज़ करने की आवश्यकता होती है।
1function createLeak(): () => void {
2 // Large array consuming significant memory
3 const largeArray: string[] = new Array(1000000).fill("leak");
4
5 // Closure capturing `largeArray`
6 return function (): void {
7 console.log(largeArray[0]); // Using the captured array
8 };
9}
10
11// Create a closure that holds a reference to the large array
12let leakyFunction = createLeak();
13
14// The large array is not released as `leakyFunction` still references it
15
16// When the object is no longer needed
17leakyFunction = null; // Explicitly remove the reference
- इस कोड में,
createLeak
के अंदर बनाया गयाlargeArray
स्कोप से बाहर जाने पर रिलीज़ होना चाहिए था, लेकिन ऐसा नहीं होता क्योंकि क्लोज़रlargeArray
को कैप्चर कर लेता है। जब तकleakyFunction
मौजूद है, यह अनावश्यक मेमोरी बनी रहेगी। - जब किसी ऑब्जेक्ट या वेरिएबल की आवश्यकता नहीं होती, तो इसका संदर्भ
null
पर सेट करने से गार्बेज कलेक्टर इसे पहचान सकता है और मेमोरी रिलीज़ कर सकता है।
लूप्स में क्लोज़र्स का दुरुपयोग
लूप के अंदर क्लोज़र्स बनाते समय, एक ही वेरिएबल का संदर्भ देने में समस्या हो सकती है। निम्न उदाहरण एक ऐसा मामला दर्शाता है जहां वेरिएबल i
सही ढंग से काम नहीं करता है।
1for (var i: number = 0; i < 3; i++) {
2 setTimeout((): void => {
3 console.log(i);
4 }, 1000);
5}
6// Output: 3, 3, 3
यह कोड वांछित परिणाम नहीं देता है क्योंकि लूप के अंत में i
का संदर्भ मान 3 है। इस समस्या को ठीक करने के लिए, या तो स्कोप को अलग करने के लिए let
का उपयोग करें या तुरंत-प्रारंभित फ़ंक्शन का उपयोग करें।
1for (let i: number = 0; i < 3; i++) {
2 setTimeout((): void => {
3 console.log(i);
4 }, 1000);
5}
6// Output: 0, 1, 2
let
का उपयोग करके, प्रत्येक लूप पुनरावृत्ति के लिए i
का स्कोप अलग किया जाता है, जो अपेक्षित परिणाम देता है।
सारांश
TypeScript में, टाइप सिस्टम का उपयोग करके क्लोज़र्स अधिक सुरक्षित और अनुमानित कोड का कारण बन सकते हैं। क्लोज़र्स का सही उपयोग डेटा को संलग्न करने और उच्च-क्रम फ़ंक्शन्स के लचीले डिज़ाइन को सक्षम करता है। इसके अलावा, क्लोज़र्स का उपयोग करते समय मेमोरी प्रबंधन और अनजाने स्कोप संदर्भों के साथ सावधानी बरतनी चाहिए।
आप हमारे YouTube चैनल पर Visual Studio Code का उपयोग करके ऊपर दिए गए लेख के साथ आगे बढ़ सकते हैं। कृपया YouTube चैनल को भी देखें।