लौकिक मृत क्षेत्र क्या है?


150

मैंने सुना है कि आरंभ करने से पहले उन तक पहुँचना letऔर constमूल्यों ReferenceErrorको अस्थायी मृत क्षेत्र कहा जाता है ।

लौकिक मृत क्षेत्र क्या है, यह गुंजाइश और उत्थापन से कैसे संबंधित है, और यह किन स्थितियों में सामना करना पड़ता है?


6
संभावित डुप्लिकेट क्या ES6 में फहराए गए या कास्ट के साथ घोषित किए गए हैं? - हालांकि यह सवाल टीडीजेड पर केंद्रित नहीं है, लेकिन उत्तर मूल रूप से एक ही हैं
बरगी

जवाबों:


201

letऔर इससे constदो व्यापक अंतर हैं var:

  1. वे ब्लॉक स्कोप हैं
  2. 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)



@zeroflagL अच्छा लिंक, धन्यवाद। यह भी कहता है: "फू अघोषित नहीं है, यह असिंचित है", यह भाषा उपर्युक्त उत्तर को स्पष्ट / सही करने में सहायक होगी। let fooकिसी ब्लॉक में उस ब्लॉक के शीर्ष पर फहराया और घोषित किया जाता है। इसके let fooकारणों की लाइन को इनिशियलाइज़ किया जाता है। और foo = xyzइसका कारण एक मूल्य सौंपा जाना है।
एजेपी

2
मेरे विचार से यह एक महान पोस्ट है! हालाँकि, मैं इस धारणा के तहत था कि 'चलो' फहराने के अधीन नहीं था? मुझे यह मोज़िला डॉक्स में मिला: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… मैं एक कूर्मडीनर बनने की कोशिश नहीं कर रहा हूं, मैं बस उत्सुक था और स्पष्टीकरण के लिए खोला गया था।
21:39 पर

1
@Jows एमडीएन पृष्ठ अभी भी कहता है कि वे फहराए नहीं गए हैं। आपको इसे संपादित करने की कोशिश करनी चाहिए, यदि आप वास्तव में निश्चित हैं कि आप क्या कह रहे हैं। मुझे लगता है कि मुझे उस बारे में एक प्रश्न पोस्ट करना चाहिए।
डबलऑर्ट

1
@joews IMO, आप या तो कह सकते हैं कि उन्हें फहराया गया है, लेकिन TDZ के कारण उनकी घोषणा तक पहुंचने से पहले उन्हें एक्सेस नहीं किया जा सकता है, या आप कह सकते हैं कि उन्हें फहराया नहीं गया है, लेकिन TDZ उनके द्वारा किसी त्रुटि को फेंकने के लिए किसी भी संदर्भ का कारण होगा। व्यावहारिक रूप से, दोनों कथन समान रूप से सत्य हैं। सिवाय, मुझे लगता है, आप "होर्डिंग" शब्द का उपयोग एक सार अर्थ में कर रहे हैं, जैसा कि "उत्थापन = जब भी इंजन उस चर के अस्तित्व से अवगत होता है"। क्या इसीलिए? इसके अलावा, चश्मा उस पर क्या कहते हैं?
doubleOrt

7

उत्थापन:
let , const, varसब प्राप्त फहराया प्रक्रिया कर रहे हैं।
(व्हाट्स का मतलब है कि वे ऊपरी तौर पर जाते हैं और दायरे के शीर्ष में घोषित होते हैं।)

initialisation:

  • varप्रारंभिक प्रक्रिया से भी गुजरें, और आरंभिक मूल्य प्राप्त करें undefined
  • हालांकि let, constप्रारंभिक प्रक्रिया को फेंक नहीं दिया, इसलिए उनके मूल्य अभी भी दुर्गम हैं, हालांकि वे पहले से ही घोषित हैं। व्हाट्स ने उन्हें अंदर डाल दियाtemporal dead zone

तो शीघ्र ही:

उत्थापन प्रक्रिया: var, let, const
initialisation प्रक्रिया: var


0

मूल रूप से लेट और कांस्टेबल चर के मामले में, टेम्पोरल डेड ज़ोन एक ज़ोन है

"आपके चर घोषित होने से पहले",

यानी जहाँ आप इन चरों के मूल्य तक नहीं पहुँच सकते हैं, यह एक त्रुटि देगा।

पूर्व।

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 करने के लिए व्यवस्थित नहीं है।
traktor53

हाँ, ठीक है, बिना किसी आरंभीकरण के फहराया जाता है। तो एक अनिर्धारित हो जाएगा।
निरंजन

उद्धृत किया गया पहला उदाहरण सही नहीं है, कृपया इसे सही करें या इसे हटा दें।
स्पाइडी का वेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.