अंतर प्रत्येक के साथ घोषित चर के दायरे में है।
व्यवहार में, अंतर के अंतर के कई उपयोगी परिणाम हैं:
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
में शामिल है और अंतिम विनिर्देश में इसकी संभावना सबसे अधिक होगी।