मैंने सुना है कि आरंभ करने से पहले उन तक पहुँचना 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 कोड a5 करने के लिए व्यवस्थित नहीं है।