2016-04-15 19 views
9

इस कोड को देखते हैं ले:अस्थायी मृत क्षेत्र से बाहर चर

<script> 
 
let {foo} = null; // TypeError 
 
</script> 
 
<script> 
 
// Here I want to assign some some value to foo 
 
</script>

पहले स्क्रिप्ट एक destructuring काम के माध्यम से जाने-घोषित करने के लिए foo प्रयास करता है। हालांकि, null को नष्ट नहीं किया जा सकता है, इसलिए असाइनमेंट टाइपएरर फेंकता है।

foo = 123; // ReferenceError: can't access lexical declaration `foo' before initialization 

और let चर redeclared नहीं किया जा सकता:

समस्या यह है कि उसके बाद foo चर घोषित लेकिन अप्रारंभीकृत है, इसलिए यदि 2 लिपि में मैं संदर्भ के लिए foo प्रयास करते हैं, फेंक देता है

let foo = 123; // SyntaxError: redeclaration of let foo 

क्या टीडीजेड से बाहर निकलने का कोई तरीका है, ताकि मैं मूल्यों को आवंटित कर सकूं और उन्हें पढ़ सकूं?

+0

बीटीडब्ल्यू, मैं 'foo' का उपयोग करना चाहता हूं, 'window.foo' जैसे कामकाज नहीं। – Oriol

+0

मुझे लगता है कि पहली स्क्रिप्ट के बारे में कुछ दिलचस्प है जो प्रारंभिकरण की वैधता को आश्वस्त करता है। – Pointy

+0

@Oriol: 'window.foo' [वैसे भी काम नहीं करेगा] (http://stackoverflow.com/q/28776079/1048572) :-) – Bergi

उत्तर

2

यह असंभव है। अस्थायी मृत क्षेत्र और अनियमित let परिवर्तनीय तक सीमित पहुंच अपरिहार्य होने की उम्मीद है। यह भ्रमित और समस्याग्रस्त है, लेकिन इरादा और अपेक्षित है।

जानकारी के लिए spec देखें:

नोट करते हैं और स्थिरांक घोषणाओं चर चल निष्पादन संदर्भ के LexicalEnvironment के दायरे वाला कर रहे हैं परिभाषित करते हैं। वेरिएबल बनाए जाते हैं जब उनके युक्त लेक्सिकल एनवायरनमेंट को तत्काल किया जाता है लेकिन किसी भी तरह से एक्सेस नहीं किया जा सकता है जब तक वेरिएबल के लेक्सिकल बाइंडिंग का मूल्यांकन नहीं किया जाता है। एक प्रारंभिक के साथ एक लेक्सिकल बाइंडिंग द्वारा परिभाषित एक चर को लेक्सिकल बाइंडिंग का मूल्यांकन किया जाता है, जब वैरिएबल बनाया जाता है, तो उसके प्रारंभकर्ता के असाइनमेंट एक्स्प्रेशन का मान असाइन किया जाता है। एक लेट घोषणा में एक LexicalBinding यदि चर घोषणा पर आरंभ नहीं किया गया था एक प्रारंभकर्ता चर मूल्य असाइन किया गया है अपरिभाषित जब LexicalBinding मूल्यांकन किया जाता है \

तो न हो, तो। (और सक्रियण से पहले फेंकने जाहिर है में परिणाम नहीं प्रारंभिकरण) इसे किसी भी माध्यम से नहीं पहुंचा जा सकता है।

लेकिन वास्तव में, आपका मुद्दा आकलन फेंकने से अधिक जटिल है। यह वास्तुकला मुद्दा है - आप परिवर्तनीय वैश्विक चर के आधार पर हैं। यह बड़ा है "नहीं, नहीं" और आपको स्पष्ट निर्भरताओं का उपयोग करने के लिए अपने कोड को दोबारा प्रतिक्रिया देना चाहिए।

संबंधित मुद्दे