जावास्क्रिप्ट क्लोजर
जावास्क्रिप्ट चर स्थानीय या वैश्विक दायरे से संबंधित हो सकते हैं।
वैश्विक चर को बंद करने के साथ स्थानीय (निजी) बनाया जा सकता है ।
सार्वत्रिक चर
ए फ़ंक्शन के अंदरfunction
परिभाषित सभी चरों को इस तरह एक्सेस कर सकता है :
उदाहरण
function myFunction() {
let a = 4;
return a * a;
}
लेकिन a फ़ंक्शन के बाहरfunction
परिभाषित वेरिएबल्स को भी एक्सेस कर सकता है, जैसे:
उदाहरण
let a = 4;
function myFunction() {
return a * a;
}
अंतिम उदाहरण में, a एक वैश्विक चर है।
एक वेब पेज में, वैश्विक चर विंडो ऑब्जेक्ट से संबंधित होते हैं।
पृष्ठ में (और विंडो में) सभी लिपियों द्वारा वैश्विक चर का उपयोग (और परिवर्तित) किया जा सकता है।
पहले उदाहरण में, a एक स्थानीय चर है।
एक स्थानीय चर का उपयोग केवल उस फ़ंक्शन के अंदर किया जा सकता है जहां इसे परिभाषित किया गया है। यह अन्य कार्यों और अन्य स्क्रिप्टिंग कोड से छिपा हुआ है।
समान नाम वाले वैश्विक और स्थानीय चर भिन्न-भिन्न चर हैं। एक को संशोधित करना, दूसरे को संशोधित नहीं करता है।
घोषणा कीवर्ड ( ,
, या ) के बिना बनाए गए चर हमेशा वैश्विक होते हैं, भले ही वे किसी फ़ंक्शन के अंदर बनाए गए हों।var
let
const
उदाहरण
function myFunction() {
a = 4;
}
परिवर्तनीय जीवनकाल
वैश्विक चर तब तक जीवित रहते हैं जब तक कि पृष्ठ को खारिज नहीं कर दिया जाता है, जैसे कि जब आप किसी अन्य पृष्ठ पर नेविगेट करते हैं या विंडो बंद करते हैं।
स्थानीय चरों का जीवन छोटा होता है। वे तब बनाए जाते हैं जब फ़ंक्शन का आह्वान किया जाता है, और फ़ंक्शन समाप्त होने पर हटा दिया जाता है।
एक काउंटर दुविधा
मान लीजिए कि आप कुछ गिनने के लिए एक चर का उपयोग करना चाहते हैं, और आप चाहते हैं कि यह काउंटर सभी कार्यों के लिए उपलब्ध हो।
आप एक वैश्विक चर का उपयोग कर सकते हैं, और एक function
काउंटर को बढ़ाने के लिए:
उदाहरण
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
उपरोक्त समाधान में एक समस्या है: पृष्ठ पर कोई भी कोड ऐड() को कॉल किए बिना काउंटर को बदल सकता है।
add()
अन्य कोड को बदलने से रोकने के लिए काउंटर फ़ंक्शन के लिए स्थानीय होना चाहिए :
उदाहरण
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 0
यह काम नहीं किया क्योंकि हम स्थानीय काउंटर के बजाय वैश्विक काउंटर प्रदर्शित करते हैं।
हम वैश्विक काउंटर को हटा सकते हैं और फ़ंक्शन को वापस करने के द्वारा स्थानीय काउंटर तक पहुंच सकते हैं:
उदाहरण
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 1.
यह काम नहीं किया क्योंकि जब भी हम फ़ंक्शन को कॉल करते हैं तो हम स्थानीय काउंटर को रीसेट कर देते हैं।
एक जावास्क्रिप्ट आंतरिक कार्य इसे हल कर सकता है।
जावास्क्रिप्ट नेस्टेड कार्य
सभी कार्यों की वैश्विक दायरे तक पहुंच है।
वास्तव में, जावास्क्रिप्ट में, सभी कार्यों के पास "ऊपर" के दायरे तक पहुंच होती है।
जावास्क्रिप्ट नेस्टेड कार्यों का समर्थन करता है। नेस्टेड फ़ंक्शंस के पास "ऊपर" के दायरे तक पहुंच है।
इस उदाहरण में, आंतरिक फ़ंक्शन के पास पैरेंट फ़ंक्शन में वेरिएबल plus()
तक पहुंच है :counter
उदाहरण
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
plus()
अगर हम बाहर से समारोह तक पहुंच सकते हैं तो यह काउंटर दुविधा को हल कर सकता है ।
counter = 0
हमें केवल एक बार निष्पादित करने का तरीका खोजने की भी आवश्यकता है ।
हमें बंद करने की जरूरत है।
जावास्क्रिप्ट क्लोजर
स्व-आह्वान कार्य याद रखें? यह फ़ंक्शन क्या करता है?
उदाहरण
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
उदाहरण समझाया गया
वेरिएबल add
को सेल्फ-इनवॉकिंग फंक्शन के रिटर्न वैल्यू को सौंपा गया है।
सेल्फ-इनवॉकिंग फंक्शन केवल एक बार चलता है। यह काउंटर को शून्य (0) पर सेट करता है, और एक फ़ंक्शन एक्सप्रेशन देता है।
इस तरह ऐड एक फंक्शन बन जाता है। "अद्भुत" हिस्सा यह है कि यह मूल दायरे में काउंटर तक पहुंच सकता है।
इसे जावास्क्रिप्ट क्लोजर कहा जाता है। यह किसी फ़ंक्शन के लिए " निजी " चर रखना संभव बनाता है।
काउंटर अज्ञात फ़ंक्शन के दायरे से सुरक्षित है, और केवल ऐड फ़ंक्शन का उपयोग करके बदला जा सकता है।
एक क्लोजर एक ऐसा फंक्शन है जिसके पास पैरेंट स्कोप बंद होने के बाद भी पैरेंट स्कोप तक पहुंच होती है।