स्कोप
आप वेरिएबल घोषित कर चुके हैं, फ़ंक्शन लिख चुके हैं और मान लौटा चुके हैं। एक और नियम तय करता है कि कोई नाम पहुँच में है या नहीं: स्कोप। यह पूछता है — «यहाँ से कौन-से नाम इस्तेमाल कर सकता हूँ?»
स्कोप का मतलब
स्कोप प्रोग्राम का वह क्षेत्र है जहाँ नाम मौजूद रहता है। उसके बाहर वही वर्तनी अदृश्य हो सकती है — या किसी और बाइंडिंग की ओर इशारा करे। कमरों की तरह सोचें: रसोई की दीवार पर लेबल रसोई में साफ़ दिखता है; सड़क पर अपने आप नहीं।
तीन रोज़मर्रा के प्रकार
📊 ग्लोबल, फ़ंक्शन और ब्लॉक स्कोप
| प्रकार | नाम कहाँ रहता है | आम औज़ार | कहाँ दिखता है? |
|---|---|---|---|
| ग्लोबल | हर फ़ंक्शन के बाहर | ऊपरी स्तर पर let / const / var |
पूरे स्क्रिप्ट में (वही पेज) |
| फ़ंक्शन (लोकल) | फ़ंक्शन बॉडी के अंदर | पैरामीटर और लोकल | सिर्फ उसी फ़ंक्शन में |
| ब्लॉक | { } जैसे if या लूप में |
let और const |
सिर्फ उसी ब्लॉक में |
ये तीन शुरुआती कोड का ज़्यादातर हिस्सा ढकते हैं। फ़ंक्शन लोकल निजी रहते हैं। let/const ब्लॉक बाइंडिंग ब्रेसिज़ के अंदर रहती हैं। ग्लोबल साझा होते हैं — साझा काउंटर के लिए उपयोगी, अगर हर नाम ग्लोबल हो जाए तो जोखिम।
let city = "Tehran";
function showCity() {
console.log(city);
}
showCity();
console.log(city);
ग्लोबल नाम फ़ंक्शन के बाहर बैठते हैं
city ऊपरी स्तर पर घोषित है, इसलिए फ़ंक्शन और बाद वाला console.log दोनों पढ़ सकते हैं। स्ट्रिंग एक बार बदलें; हर पाठक नया मान देखेगा। ग्लोबल तभी जब कई हिस्से सच में एक मान साझा करें।
function greet() {
let message = "Hello";
console.log(message);
}
greet();
// console.log(message); // Error: message is not defined
लोकल फ़ंक्शन के अंदर रहते हैं
message सिर्फ तब तक है जब greet चल रहा हो। बाहर वह नाम परिभाषित नहीं। पैरामीटर भी वैसे ही: उसी फ़ंक्शन के लोकल जो उन्हें सूचीबद्ध करता है।
if (true) {
let score = 10;
console.log(score);
}
// console.log(score); // Error: score is not defined
let और const ब्लॉक का सम्मान करते हैं
{ } के अंदर let या const बाइंडिंग सिर्फ उसी ब्लॉक में दिखती है। बंद ब्रेस के बाद score चला जाता है। पुराना var फ़ंक्शन-स्कोप्ड है और ब्लॉक से «लीक» कर सकता है। let/const चुनें ताकि ब्लॉक किनारा वही मतलब दे जो दिखता है।
let title = "Shop";
function show() {
let label = "open";
console.log(title + " is " + label);
}
show();
नेस्टेड कोड बाहर देखता है
show बाहरी title और अपना label दोनों पढ़ सकता है। खोज मिलान तक बाहर चलती है। अंदर की ओर नहीं: बाहरी कोड वह नाम नहीं देखता जो सिर्फ फ़ंक्शन के अंदर जन्मा हो।
let status = "ok";
function check() {
let status = "busy";
console.log(status);
}
check();
console.log(status);
शैडोइंग: अंदर, अंदरूनी जीतता है
check के अंदर लोकल status बाहरी को छिपा देता है। कॉल busy प्रिंट करता है। फ़ंक्शन खत्म होने पर बाहरी अभी भी ok है। एक वर्तनी, दो बाइंडिंग — स्कोप तय करता है किसे छूते हो।
स्कोप्ड मान पेज पर दिखाएँ
एक ग्लोबल लेबल रखें, फ़ंक्शन में ऐसी पंक्ति बनाएँ जो अभी भी उसे पढ़ सके, और नतीजा पैराग्राफ में लिखें।
<!DOCTYPE html>
<html>
<head>
<title>scope — page</title>
</head>
<body>
<p id="msg">…</p>
<script>
let place = "Garden";
function line() {
let state = "open";
return place + " is " + state;
}
let box = document.getElementById("msg");
box.textContent = line();
</script>
</body>
</html>
पैराग्राफ Garden is open दिखाता है। place ग्लोबल है; state line का लोकल है। फ़ंक्शन दोनों पढ़ता है, एक स्ट्रिंग लौटाता है, पेज दिखाता है। सिर्फ place बदलें, रिफ़्रेश करें, नई पंक्ति पढ़ें। अगला: closures — फ़ंक्शन जो बाहरी कॉल खत्म होने के बाद भी बाहरी नाम जीवित रखते हैं।
अभ्यास चरण
- ग्लोबल
let app = "demo"घोषित करें और छोटे फ़ंक्शन से तथा बाहर से लॉग करें। - फ़ंक्शन के अंदर
let secret = 1रखें; बाहरsecretलॉग करने पर त्रुटि सुनिश्चित करें। if (true) { }मेंlet n = 5घोषित कर लॉग करें; ब्लॉक के बाद फिर कोशिश करें।- नेस्टेड फ़ंक्शन से बाहरी
letबिना फिर घोषित किए पढ़ें। - बाहरी
let tag = "A"पर अंदरूनीlet tag = "B"से छाया डालें और दोनों जगह लॉग करें। - HTML डेमो में सिर्फ
placeस्ट्रिंग बदलें, रिफ़्रेश करें, पैराग्राफ पढ़ें।
आम गलतियाँ
- लोकल नाम अपने फ़ंक्शन के बाहर इस्तेमाल — ReferenceError, चुप खाली नहीं
- उम्मीद कि ब्लॉक में
varletजैसा निजी रहे - मानना कि बाहरी कोड सिर्फ नेस्टेड फ़ंक्शन में जन्मे नाम देखे
- स्कोप को
returnसे मिलाना — एक दृश्यता है, दूसरा मान भेजना - यहाँ पूरी closures पाठ की उम्मीद — वह अगला पेज है
सार
- स्कोप वह जगह है जहाँ नाम दिखता और इस्तेमाल होता है
- ग्लोबल फ़ंक्शन के बाहर रहते हैं और स्क्रिप्ट में साझा होते हैं
- लोकल और पैरामीटर अपने फ़ंक्शन में रहते हैं
{ }मेंlet/constब्लॉक-स्कोप्ड हैं; लीक करने वालेvarसे बेहतर- नेस्टेड बाहर पढ़ सकता है; बाहर सिर्फ-अंदरूनी नाम नहीं देखता
- समान नाम की अंदरूनी बाइंडिंग बाहरी पर छाया डालती है
- पेज अपडेट लौटाई स्ट्रिंग में ग्लोबल और लोकल मिला सकता है
- अगला: closures — फ़ंक्शन जो बाहरी नाम याद रखते हैं
🧠 अपने ज्ञान की परीक्षा करें
अपने ज्ञान की परीक्षा करें
इस इंटरैक्टिव क्विज़ के साथ अपनी चुनौती लें और देखें कि आप विषय को कितनी अच्छी तरह समझते हैं
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी