मैंने सुना है कि आरंभ करने से पहले उन तक पहुँचना let
और const
मूल्यों ReferenceError
को अस्थायी मृत क्षेत्र कहा जाता है ।
लौकिक मृत क्षेत्र क्या है, यह गुंजाइश और उत्थापन से कैसे संबंधित है, और यह किन स्थितियों में सामना करना पड़ता है?
मैंने सुना है कि आरंभ करने से पहले उन तक पहुँचना let
और const
मूल्यों ReferenceError
को अस्थायी मृत क्षेत्र कहा जाता है ।
लौकिक मृत क्षेत्र क्या है, यह गुंजाइश और उत्थापन से कैसे संबंधित है, और यह किन स्थितियों में सामना करना पड़ता है?
जवाबों:
let
और इससे const
दो व्यापक अंतर हैं var
:
var
घोषित होने से पहले एक्सेस करने का परिणाम है undefined
; इसे फेंके जाने से पहले let
या उससे const
पहले एक्सेस करना ReferenceError
:console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
यह इन उदाहरणों से प्रकट होता है कि let
घोषणाएं (और const
, जो उसी तरह से काम करती हैं) को फहराया नहीं जा सकता है , क्योंकि aLet
यह मान असाइन किए जाने से पहले मौजूद नहीं दिखता है।
उस मामले, however- नहीं है let
और const
कर रहे हैं फहराया (जैसे var
, class
और function
), लेकिन गुंजाइश में प्रवेश करने और जहां वे पहुँचा नहीं जा सकता घोषित किया गया जो अवधि होती है। यह अवधि अस्थायी मृत क्षेत्र (TDZ) है ।
असाइन किए जाने के बजाय घोषित किए जाने पर TDZ समाप्त हो aLet
जाता है :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
यह उदाहरण दिखाता है कि let
फहराया गया है:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
क्रेडिट: टेम्पोरल डेड ज़ोन (TDZ) ध्वस्त
x
आंतरिक दायरे में पहुँचना अभी भी एक कारण बनता है ReferenceError
। यदि let
फहराया नहीं गया था, तो यह लॉग होगा outer value
।
टीडीजेड एक अच्छी बात है क्योंकि यह बग को उजागर करने में मदद करता है - घोषित किए जाने से पहले एक मूल्य तक पहुंचना शायद ही जानबूझकर किया गया है।
TDZ डिफ़ॉल्ट फ़ंक्शन तर्कों पर भी लागू होता है। तर्क का मूल्यांकन दाएं से बाएं किया जाता है, और प्रत्येक तर्क TDZ में है जब तक कि इसे सौंपा नहीं गया है:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
TDZ को babel.js ट्रांसपाइलर में डिफ़ॉल्ट रूप से सक्षम नहीं किया गया है । आरईपीएल में इसका उपयोग करने के लिए "उच्च अनुपालन" मोड चालू करें । es6.spec.blockScoping
सीएलआई के साथ या पुस्तकालय के रूप में उपयोग करने के लिए ध्वज की आपूर्ति करें ।
आगे पढ़ने की सिफारिश की: TDZ ध्वस्त और ES6 लेट, कांस्ट और गहराई में "टेम्पोरल डेड जोन" (TDZ) ।
let foo
किसी ब्लॉक में उस ब्लॉक के शीर्ष पर फहराया और घोषित किया जाता है। इसके let foo
कारणों की लाइन को इनिशियलाइज़ किया जाता है। और foo = xyz
इसका कारण एक मूल्य सौंपा जाना है।
उत्थापन:
let
, const
, var
सब प्राप्त फहराया प्रक्रिया कर रहे हैं।
(व्हाट्स का मतलब है कि वे ऊपरी तौर पर जाते हैं और दायरे के शीर्ष में घोषित होते हैं।)
initialisation:
var
प्रारंभिक प्रक्रिया से भी गुजरें, और आरंभिक मूल्य प्राप्त करें undefined
।let
, const
प्रारंभिक प्रक्रिया को फेंक नहीं दिया, इसलिए उनके मूल्य अभी भी दुर्गम हैं, हालांकि वे पहले से ही घोषित हैं। व्हाट्स ने उन्हें अंदर डाल दियाtemporal dead zone
तो शीघ्र ही:
उत्थापन प्रक्रिया:
var
,let
,const
initialisation प्रक्रिया:var
मूल रूप से लेट और कांस्टेबल चर के मामले में, टेम्पोरल डेड ज़ोन एक ज़ोन है
"आपके चर घोषित होने से पहले",
यानी जहाँ आप इन चरों के मूल्य तक नहीं पहुँच सकते हैं, यह एक त्रुटि देगा।
पूर्व।
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
उपरोक्त कोड एक त्रुटि देता है
जब हम वैरिएबल 'a' के लिए var का उपयोग करते हैं तो वही कोड एरर नहीं देगा।
पूर्व।
var sum = a;
console.log(sum) //prints undefined
var a = 5;
undefined
और 5
) का परिणाम "NaN" पैदा करता है । की घोषणा की गई var a
है फहराया, inifialisation कोड a
5 करने के लिए व्यवस्थित नहीं है।