@thefourtheye यह कहने में सही है कि इन चरों को घोषित किए जाने से पहले एक्सेस नहीं किया जा सकता है । हालाँकि, यह उससे थोड़ा अधिक जटिल है।
क्या चर को घोषित किया गया है let
या const
नहीं फहराया गया है? यहाँ वास्तव में क्या हो रहा है?
सभी घोषणाओं ( var
, let
, const
, function
, function*
, class
) "फहराया" कर रहे हैं जावास्क्रिप्ट में। इसका मतलब यह है कि यदि किसी नाम को एक दायरे में घोषित किया जाता है, तो उस दायरे में पहचानकर्ता हमेशा उस विशेष चर का संदर्भ देगा:
x = "global";
// function scope:
(function() {
x; // not "global"
var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"
let/const/… x;
}
यह फ़ंक्शन और ब्लॉक स्कोप 1 के लिए सच है ।
var
/ function
/ function*
घोषणाओं और let
/ const
/ class
घोषणाओं के बीच का अंतर आरंभीकरण है ।
पूर्व को undefined
(जनरेटर) फ़ंक्शन के साथ आरंभीकृत किया जाता है जब दायरा के शीर्ष पर बाइंडिंग बनाई जाती है। Lexically घोषित चर तथापि रहने uninitialised । इसका मतलब है कि ReferenceError
जब आप इसे एक्सेस करने की कोशिश करते हैं तो एक अपवाद फेंक दिया जाता है। यह केवल तब ही आरंभ हो जाएगा जब let
/ const
/ class
कथन का मूल्यांकन किया जाता है, इससे पहले कि सब कुछ (ऊपर) जिसे अस्थायी मृत क्षेत्र कहा जाता है ।
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined
var x = "local";
let y = "local";
}());
ध्यान दें कि एक let y;
स्टेटमेंट इस undefined
तरह के वेरिएबल को इनिशियलाइज़ करता let y = undefined;
है।
लौकिक मृत क्षेत्र एक वाक्यात्मक स्थान है, बल्कि नहीं है समय चर (गुंजाइश) निर्माण और initialisation के बीच। जब तक उस कोड को निष्पादित नहीं किया जाता है तब तक घोषणा के ऊपर कोड में चर को संदर्भित करने के लिए यह एक त्रुटि नहीं है (उदाहरण के लिए एक फ़ंक्शन बॉडी या बस मृत कोड), और यह एक अपवाद को फेंक देगा यदि आप एक्सेस करने से पहले ही आरंभीकरण से पहले चर का उपयोग करते हैं कोड घोषणा से नीचे है (उदाहरण के लिए फहराया गया फ़ंक्शन घोषणा में जिसे बहुत जल्दी कहा जाता है)।
वहाँ के बीच कोई अंतर है let
और const
इस मामले में?
नहीं, वे वही काम करते हैं जहां तक उत्थापन माना जाता है। उनके बीच एकमात्र अंतर यह है कि एक const
चींटी होनी चाहिए और केवल घोषणा के प्रारंभिक भाग में सौंपी जा सकती है (जैसे const one = 1;
, दोनों const one;
और बाद के पुनर्मूल्यांकन one = 2
अमान्य हैं)।
1: var
घोषणाएं अभी भी केवल फ़ंक्शन स्तर पर काम कर रही हैं, निश्चित रूप से
let foo = () => bar; let bar = 'bar'; foo();
दर्शाने जैसा कुछ बेहतर प्रभाव है, क्योंकि यह अस्थायी मृत क्षेत्र के कारण स्पष्ट नहीं है।