2013-10-11 13 views
14

यदि मैं एक गैर-मौजूद चर का संदर्भ देने का प्रयास करता हूं, तो मुझे जावास्क्रिप्ट में संदर्भ त्रुटि मिलती है। एक गैर-मौजूद वस्तु संपत्ति का संदर्भ क्यों 'अपरिभाषित' देता है? यहाँ कुछ कोड है, बशर्ते मैं एक ब्राउज़र में यह लिख रहा हूँ है:जावास्क्रिप्ट में किसी ऑब्जेक्ट की गैर-मौजूद संपत्ति का संदर्भ क्यों संदर्भ संदर्भ नहीं देता है?

alert(a); 
ReferenceError: a is not defined //error is thrown 
alert({}.a) 
undefined //no error 
+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? अगर मैं एक जुआ आदमी था तो मैं कहूंगा कि यह अस्तित्व में है लेकिन या तो शून्य या खाली है। क्या आपने कंसोल के साथ डीबग किया है? –

+4

क्या आप पूछ रहे हैं कि भाषा इस तरह से क्यों डिज़ाइन की गई है? @ माइकहोमेट्को - मैं आपकी शर्त लेता हूं: गैर-मौजूद गुण 'अनिर्धारित' वापस लौटते हैं, जबकि गुण 'शून्य' वापसी 'शून्य' होते हैं (और यदि "खाली" से आपका मतलब खाली स्ट्रिंग है जो वापस आ जाएगा, ठीक है, खाली स्ट्रिंग); चीजों को और भी भ्रमित करने के लिए, गुण जो मौजूद हैं लेकिन जिन्हें 'अनिर्धारित' मान दिया गया है, वे भी 'अपरिभाषित' वापस आते हैं। – nnnnnn

+0

@nnnnnn मुझे लगता है कि वह है ... –

उत्तर

9

है कि कितना भाषा काम करता है। इसका ऑब्जेक्ट-आधारित दृष्टिकोण बहुत लचीला है, और आप रनटाइम पर ऑब्जेक्ट्स से गुणों को गतिशील रूप से जोड़, अपडेट और हटा सकते हैं। वर्तमान में मौजूद नहीं है, जो अपवाद बढ़ाने के बजाय undefined उत्पन्न करना चाहिए। यह, उदाहरण के लिए, एक भी अभिव्यक्ति में अस्तित्व और प्रकार के लिए जाँच की अनुमति देता है:

if (prop in obj && typeof obj[prop] == "function") obj[prop](); 
// can be written shorter: 
if (typeof obj[prop] == "function") obj[prop](); 

आप इसे का उपयोग किए बिना मूल्य मिल सकता है। undefined का उपयोग करके अधिकांश परिस्थितियों में फेंक दिया जाएगा।

इसके विपरीत, चर को उनके दायरे में स्थिर रूप से घोषित किया जाता है। एक अविकसित चर का उपयोग हमेशा एक त्रुटि है, जो ReferenceError एस को फेंकने का वैध बनाता है।

+0

धन्यवाद, लेकिन मुझे वह सब पता है। मुझे "दृश्यों के पीछे" प्रक्रियाओं में दिलचस्पी है, उदाहरण के लिए [क्यों आप 'हटाएं' ऑपरेटर के साथ कस्टम ऑब्जेक्ट्स के प्रोपरीज को हटा सकते हैं, और वेरिएबल्स और फ़ंक्शंस को हटा नहीं सकते हैं।] (Http://perfectionkills.com/understanding -डिलीट /) –

+2

इसके लिए, मैं [ईसीएमएस्क्रिप्ट विनिर्देश] (http://ecma-international.org/ecma-262/5.1/) पढ़ने की अनुशंसा करता हूं, विशेष रूप से अनुभागों पर 8.6, 8.7, और 8.12 अनुभाग, 11.2 .1 और ऑपरेटरों के लिए 11.4.1, और संभवतः 10 [.2] चर और स्कॉप्स के बारे में। हालांकि, spec * क्यों * समझा नहीं है, यह सिर्फ * क्या * कहते हैं। – Bergi

+2

ध्यान दें कि "संदर्भ त्रुटि" केवल सख्त मोड में मौजूद है। सख्त मोड में बदलावों का सारांश [अनुलग्नक सी] में है (http://www.ecma-international.org/ecma-262/5.1/#sec-C)। सख्त मोड अनजान संदर्भों को प्रतिबंधित करता है। ऑब्जेक्ट गुण अनजान संदर्भ नहीं हैं। –

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