अंतर प्रत्येक के साथ घोषित चर के दायरे में है।
व्यवहार में, अंतर के अंतर के कई उपयोगी परिणाम हैं:
letचर केवल उनके निकटतम संलग्न ब्लॉक ( { ... }) में दिखाई देते हैं ।
letचर केवल कोड की पंक्तियों में उपयोग करने योग्य होते हैं जो चर घोषित होने के बाद होते हैं (भले ही वे फहराए गए हों !)।
letचर एक बाद varया द्वारा redeclared नहीं किया जा सकता है let।
- वैश्विक
letचर वैश्विक windowऑब्जेक्ट में नहीं जोड़े जाते हैं ।
letचर को क्लोजर के साथ उपयोग करना आसान है (वे दौड़ की स्थिति पैदा नहीं करते हैं )।
letचरों की दृश्यता को कम करने और अप्रत्याशित नाम टकराने की संभावना को बढ़ाने के लिए लगाए गए प्रतिबंध जल्दी मिल जाएंगे। इससे चर को ट्रैक करना आसान हो जाता है और चर के बारे में पता चलता है, जिसमें उनकी रीचबिलिटी (अप्रयुक्त मेमोरी को पुनः प्राप्त करने में मदद करना) शामिल है।
इसके फलस्वरूप, let बड़े कार्यक्रमों में उपयोग किए जाने पर या जब स्वतंत्र रूप से विकसित रूपरेखाओं को नए और अनपेक्षित तरीकों से संयोजित किया जाता है चर की समस्याएं कम होती हैं।
varयदि आप सुनिश्चित हैं कि आप लूप (# 5) में क्लोजर का उपयोग करते समय या अपने कोड (# 4) में बाह्य-दृश्यमान वैश्विक चर घोषित करने के लिए एकल-बाध्यकारी प्रभाव चाहते हैं, तब भी उपयोगी हो सकते हैं। varयदि exportट्रांसपाइलर स्पेस से बाहर निकलता है और कोर लैंग्वेज में एक्सपोर्ट्स के लिए इस्तेमाल किया जा सकता है ।
उदाहरण
1. पास के एनक्लोजर ब्लॉक के बाहर कोई उपयोग नहीं:
कोड का यह ब्लॉक एक संदर्भ त्रुटि को फेंक देगा, क्योंकि ब्लॉक का दूसरा उपयोग xउस ब्लॉक के बाहर होता है जहां यह घोषित किया गया है let:
{
let x = 1;
}
console.log(`x is ${x}`); // ReferenceError during parsing: "x is not defined".
इसके विपरीत, varकाम के साथ एक ही उदाहरण है ।
2. घोषणा से पहले कोई उपयोग नहीं:
कोड को ReferenceErrorचलाने से पहले कोड के इस ब्लॉक को फेंक दिया जाएगा क्योंकि xयह घोषित होने से पहले उपयोग किया जाता है:
{
x = x + 1; // ReferenceError during parsing: "x is not defined".
let x;
console.log(`x is ${x}`); // Never runs.
}
इसके विपरीत, varपर्स के साथ एक ही उदाहरण और बिना किसी अपवाद को फेंकने के बिना चलता है।
3. कोई पुनर्वितरण नहीं:
निम्नलिखित कोड दर्शाता है कि एक चर के साथ घोषित किया गया letहो सकता है बाद में पुन: घोषित नहीं किया जा सकता है:
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
4. ग्लोबल्स संलग्न नहीं हैं window:
var button = "I cause accidents because my name is too common.";
let link = "Though my name is common, I am harder to access from other JS files.";
console.log(link); // OK
console.log(window.link); // undefined (GOOD!)
console.log(window.button); // OK
5. क्लोजर के साथ आसान उपयोग:var लूप के अंदर क्लोजर के साथ
घोषित चर के साथ अच्छी तरह से काम नहीं करते हैं। यहां एक सरल लूप है जो उन मानों के अनुक्रम को आउटपुट करता है iजो समय में विभिन्न बिंदुओं पर चर होते हैं:
for (let i = 0; i < 5; i++) {
console.log(`i is ${i}`), 125/*ms*/);
}
विशेष रूप से, यह आउटपुट:
i is 0
i is 1
i is 2
i is 3
i is 4
जावास्क्रिप्ट में हम अक्सर जब वे बनाए जाते हैं की तुलना में काफी बाद में चर का उपयोग करते हैं। जब हम आउटपुट को देरी से प्रदर्शित करते हैं, तो एक क्लोजर के साथ आउटपुट में देरी होती है setTimeout:
for (let i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... जब तक हम साथ रहेंगे तब तक आउटपुट अपरिवर्तित रहता है let। इसके विपरीत, अगर हमने var iइसके बजाय उपयोग किया था :
for (var i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... लूप अप्रत्याशित रूप से आउटपुट "मैं 5" पांच बार है:
i is 5
i is 5
i is 5
i is 5
i is 5
letमें शामिल है और अंतिम विनिर्देश में इसकी संभावना सबसे अधिक होगी।