2015-06-25 8 views
7

पारंपरिक वर-घोषित चर, जो पूरे संलग्नित से जुड़े होते हैं, के विपरीत उन्हें प्रदर्शित करने की परवाह किए बिना दायरे में कार्य - let घोषणाओं ब्लॉक गुंजाइश के लिए देते हैं लेकिन आरंभ नहीं कर रहे हैं, जब तक वे ब्लॉकमैं कैसे जांच सकता हूं कि ES6 पर `let` चर घोषित किया गया है या नहीं?

तो में दिखाई देते हैं:

console.log(a); // undefined 
console.log(b); // ReferenceError! 

var a; 
let b; 

तो ऐसा लगता है कि hoisting यहां लागू नहीं है।

प्रश्न

यदि हां, तो कैसे मैं सुरक्षित रूप से जांच कर सकते हैं चर घोषित किया गया है?

एनबी - जो विकल्प मैं देखता हूं वह कोशिश/पकड़ लेता है और निश्चित रूप से हमेशा let चर को दायरे में डाल देता है। लेकिन फिर भी मेरा प्रश्न

+1

आप यह जांच नहीं सकते कि कोई चर (या तो 'let' या 'var') घोषित किया गया है या नहीं। आप केवल यह जांच सकते हैं कि उन्हें परिभाषित किया गया है या नहीं। आप वैसे भी ऐसा करने की कोशिश क्यों कर रहे हैं? आपका उपयोग केस क्या है? –

+0

@AaditMShah मामला सीख रहा है। var के साथ मैं कर सकता था: 'अगर (एक ===' अपरिभाषित 'टाइप करें) ' –

+3

मेरी टिप्पणी संपादित की।आप क्या कर रहे हैं यह जांच कर रहा है कि चर परिभाषित किया गया है या नहीं। आप यह जांच नहीं रहे हैं कि इसे घोषित किया गया है या नहीं। –

उत्तर

8

ऐसा लगता है कि होस्टिंग यहां लागू नहीं है।

बिल्कुल नहीं। परिवर्तनीय अभी भी पूर्ण दायरे को कवर करता है, बाध्यकारी तब बनाई जाती है जब दायरा var एस के साथ दर्ज किया जाता है।

लेकिन आप सही हैं, var के विपरीत यह undefined के साथ तुरंत शुरू नहीं हुआ है, केवल तभी जब let कथन का मूल्यांकन किया जाता है। दायरे के शीर्ष से क्षेत्र को अस्थायी मृत क्षेत्र कहा जाता है - पहचानकर्ता बाध्य है, लेकिन उपयोग किए जाने पर हमेशा ReferenceError फेंक देगा।

परिवर्तनीय घोषित किए जाने पर मैं सुरक्षित रूप से जांच कैसे कर सकता हूं?

आप नहीं कर सकते हैं, बस के रूप में आप के लिए var रों नहीं कर सकता। आपको वैसे भी इसकी आवश्यकता नहीं है।

1: चलिए वैश्विक चर को अनदेखा करते हैं जो यहां वैश्विक वस्तु के गुण बन जाते हैं।
2: var/function/function*-घोषित चर, मेरा मतलब है। लेक्सिकल बाइंडिंग्स (let, const) वास्तव में वैश्विक गुण नहीं बनते हैं।

+0

बर्गि: 'var' I _can_ के साथ IMHO 'टाइपोफ़' के माध्यम से चेक करें (उस स्थिति को छोड़कर जहां उसने 'var g = undefined'' को अपरिभाषित किया है और' if ('x' विंडो में) 'के साथ भी (वैश्विक के लिए - नहीं स्कॉप्स।) –

+0

@ रॉयनामिर: सुनिश्चित नहीं है कि आपका क्या मतलब है, न ही आपका उपयोग केस क्या है। 'टाइपोफ़ x' हमेशा' अनिर्धारित 'वापस लौटाता है, यदि चर मौजूद नहीं है या मान' अपरिभाषित 'है। भले ही इसे घोषित किया गया हो या नहीं। – Bergi

+0

आपने कहा: _ आप नहीं कर सकते, जैसा कि आप vars_ के लिए नहीं कर सकते - मैंने अभी उल्लेख किया है कि मैं _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ –

3

यही होगा के सबसे करीब के लिए आप क्या देख रहे हैं:

try { 
    console.log(typeof mima); // or any other use of variable 
    let mima = 'no ni ma'; 
} catch (error) { 
    console.log(error); // “Uncaught ReferenceError: mima is not defined(…)” 

    // and then taking some actions regarding the situation 
} 

हालांकि, इसकी उपयोगिता बल्कि बहस का मुद्दा है। लेकिन अगर मुझे let 'एड वैरिएबल जांचना पड़ा, तो मैं ऐसा कुछ करूँगा। हालांकि, आपको लगता है कि let के साथ आप लापता चर को सुरक्षित रूप से नहीं बना सकते हैं, क्योंकि यह catch ब्लॉक से घिरा हुआ है। लेकिन यह कोड तोड़ नहीं होगा।

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

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