2012-04-11 11 views
6

javascriptwindow वैश्विक वस्तु है, जिसका अर्थ है वैश्विक स्तर पर प्रत्येक वस्तु window का बच्चा है।संदर्भ त्रुटि और वैश्विक वस्तु

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

उन दो लाइनों, एक ही होना चाहिए वे नहीं करना चाहिए: तो क्यों मैं इस परिणाम मिलता है?

उत्तर

17

क्योंकि window.foo के साथ आप foowindow ऑब्जेक्ट की संपत्ति स्पष्ट रूप से देख रहे हैं जो बाद के विकल्प में नहीं है। बाद के विकल्प में, यदि foo परिभाषित नहीं किया गया है, तो आपको डेवलपर को यह जानने में सक्षम होना चाहिए कि इसे परिभाषित नहीं किया गया है और इसे दुभाषिया के बजाय स्पष्ट त्रुटि चेतावनी प्राप्त करने के बजाय इसे undefined पर सेट किया जाना चाहिए (जैसे पहले मामले) जो नेतृत्व करेगा पर अप्रत्याशित परिणाम।

Reference Error:

एक त्रुटि का प्रतिनिधित्व करता है जब किसी गैर-मौजूद चर संदर्भित है। एक संदर्भ को अस्वीकार करने की कोशिश करते समय एक संदर्भ त्रुटि फेंक दी गई है जिसे घोषित नहीं किया गया है।

अधिक जानकारी के लिए इस लेख पर एक नज़र डालें:

लेख ऊपर से हवाला देते हुए:

एक संदर्भ unresolvable माना जाता है यदि इसके आधार मूल्य अपरिभाषित है। इसलिए डॉट से पहले मान अपरिभाषित होने पर एक संपत्ति संदर्भ अनजान है। निम्नलिखित उदाहरण एक संदर्भ त्रुटि फेंक देगा लेकिन ऐसा इसलिए नहीं है क्योंकि TypeError पहले वहां जाता है। ऐसा इसलिए है क्योंकि किसी संपत्ति का मूल मूल्य चेकऑब्जेक्टकोर्सेबल (ईसीएमए 5 9 .10 के माध्यम से 11.2.1 के माध्यम से) है जो अपरिभाषित प्रकार को ऑब्जेक्ट में कनवर्ट करने का प्रयास करते समय टाइप एरर फेंकता है।

उदाहरण:

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

संदर्भ जो न तो गुण या चर हैं परिभाषा unresolvable से कर रहे हैं और एक ReferenceError फेंक देते हैं, तो:

foo; //ReferenceError 
2

आपके पहले उदाहरण (window.foo) में आप विंडो ऑब्जेक्ट की एक संपत्ति तक पहुंच रहे हैं। जब आप किसी ऑब्जेक्ट की एक मौजूदा मौजूदगी तक पहुंचने का प्रयास कर रहे हैं, तो जावास्क्रिप्ट "अपरिभाषित" लौटाता है। यह इस तरह से डिजाइन किया गया है।

दूसरे उदाहरण में आप सीधे एक चर का संदर्भ दे रहे हैं, और चूंकि यह अस्तित्व में नहीं है एक त्रुटि उठाई गई है।

यह जावास्क्रिप्ट डिज़ाइन और काम करने का तरीका है।

1

जावास्क्रिप्ट में आप प्रदान कर सकते हैं उस तरह फ्लाई पर ऑब्जेक्ट फ़ील्ड, इसलिए window.fooलगभग (नीचे टिप्पणी) var foo;को बराबर देखते हैं जब वैश्विक संदर्भ में परिभाषित किया गया, सिर्फ foo बुला नीले रंग से बाहर है, जबकि ब्राउज़र आतंक 'जिसमें देखने पर आपत्ति कारण यह down't भी पता बनाता सूचना, यदि आप कार्य करें:।

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo'' var foo' के बराबर नहीं है। –

+0

@ टिमडाउन। क्या आप कुछ और विस्तार से बता सकते हैं? शायद एक जवाब में? – gdoron

+0

@ टिमडाउन और @gdoron ठीक है, यह थोड़ा असत्य है - मेरा मतलब था कि window.foo वैश्विक संदर्भ में घोषित होने पर 'var foo' के बराबर है। – JKing

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