2014-07-01 7 views
10

मैं निम्नलिखित जावास्क्रिप्ट संलग्न के साथ एक HTML पृष्ठ है।JavaScript वैरिएबल अपरिभाषित बनाम परिभाषित नहीं

alert(box); 
box = "Thinking outside the box"; 

कंसोल में मैं "Uncaught ReferenceError: बॉक्स से परिभाषित नहीं है"

जब मैं यह करने के लिए बदलने के लिए:

alert(box); 
var box = "Thinking outside the box"; 

चेतावनी को फोन किया और अपरिभाषित से पता चलता हो जाता है। मुझे यह समझाने में सक्षम होना चाहिए, मुझे ऐसा क्यों लगता है कि ऐसा क्यों होता है। मुझे पता है कि जब मैं var का उपयोग करता हूं, जावास्क्रिप्ट जानता है कि अलर्ट निष्पादित होने से पहले वेरिएबल है, लेकिन इसके लिए आवश्यक मूल्य नहीं है ?? क्या मैं यहाँ से दूर हूँ? इसे समझने में कुछ मदद की ज़रूरत है।

+4

"उत्थापन" – elclanrs

+0

बुला बॉक्स, इससे पहले कि आप बॉक्स को परिभाषित किया है, यह मौजूद नहीं है, यह केवल मौजूद है जब आप इसे परिभाषित करते हैं, 'यह एक मूल्य है या नहीं के बारे में पढ़ें। – saj

+0

आपकी समझ काफी वहाँ [के बीच 'अनिर्धारित' और जावास्क्रिप्ट में क्या अंतर है 'नहीं परिभाषित'?] है :) की –

उत्तर

9

जब आप var साथ एक चर को परिभाषित, चर की घोषणा दायरे के शीर्ष पर "फहराया" है और इस प्रकार चर पूरे दायरे के लिए परिभाषित किया गया है। चर का प्रारंभिकरण (इसे प्रारंभिक मान निर्दिष्ट करना) कोड में एक ही स्थान पर रहता है।

तो, आपके दूसरे उदाहरण में, जब आप alert(box) करते हैं, तो box परिवर्तनीय var कथन के कारण पहले ही घोषित कर दिया गया है। आपकी दूसरी उदाहरण:

var box; 
alert(box); 
box = "Thinking outside the box"; 

यह box चर घोषित करता है (हालांकि आरंभ नहीं:

alert(box); 
var box = "Thinking outside the box"; 

मूल रूप से (box चर की घोषणा दायरे के शीर्ष करने के फहराया जाता है) इस के बराबर है) अपने alert(box) बयान से पहले और इस तरह आप एक परिणाम है कि संगत है के साथ चर घोषित किया जा रहा है, लेकिन अभी तक कोई मूल्य होने मिल (alert() रिपोर्ट undefined जो क्या होता है जब चर मौजूद है, लेकिन अभी तक प्रारंभ नहीं किया गया है)।

आपका पहला उदाहरण var का उपयोग नहीं करता है और इस तरह वहाँ कोई उत्थापन तो बिंदु जहां alert(box) कर में, सभी नामित box में कोई चर है और इस प्रकार आप uncaught reference error मिलता है।

कई, कई पदों इतने पर है कि यहाँ उत्थापन के विवरण का वर्णन कर रहे हैं। आप यहां उनकी एक लंबी सूची देख सकते हैं: https://stackoverflow.com/search?q=javascript+variable+hoisting जहां आपको वेरिएबल होस्टिंग का और स्पष्टीकरण मिलेगा।

नोट: समारोह घोषणाओं भी, जो पोस्ट आप समारोह घोषणाओं के बजाय चर घोषणाओं के बारे में हो जाएगा लगता है में से कुछ तो फहराया जाता है, हालांकि अवधारणा काफी एक ही है।

+0

बीमार जांच इस उत्तर 3 मिनट में के रूप में सही। धन्यवाद, मैं स्पष्टीकरण की सराहना करता हूं। –

+1

मुझे लगता है कि कारण मैं ऐसे मुसीबत था खोजने एक और पद था, क्योंकि मैं अवधि उत्थापन समझ में नहीं आया। अब मुझे कई सवाल मिल रहे हैं। –

+2

@EricB - हां, कभी कभी तुम सिर्फ ऑपरेटिव खोज शब्द जानना चाहते हैं। – jfriend00

2

यह चर उत्थापन से कोई लेना देना नहीं है। इसका मतलब है कि, चर घोषणाओं (और सामान्य में घोषणाओं) से पहले किसी भी कोड निष्पादित होने पर कार्रवाई की जाती है, कोड में कहीं भी एक चर घोषित करने शीर्ष पर यह घोषित करने के बराबर है। इसका यह भी अर्थ है कि घोषित होने से पहले एक चर का उपयोग किया जा सकता है।

आप निम्न कर जब: उस पर,

var box; 
alert(box); 
box = "Thinking outside the box" 

अपने पहले मामले में, आप कोई चर घोषणाओं की है, और इसलिए फहराया नहीं है पर:

alert(box) 
var box = "Thinking outside the box" 

यह परोक्ष रूप में समझा जाता बिंदु बॉक्स undefined

ऐसा क्यों होता है है?

For completeness, let’s mention that actually at the implementation level things are a little more complex. There are two stages of the code handling, where variables, function declarations, and formal parameters are created at the first stage, which is the stage of parsing and entering the context. In the second stage, the stage of runtime code execution, function expressions and unqualified identifiers (undeclared variables) are created. But for practical purposes, we can adopt the concept of hoisting, which is actually not defined by ECMAScript standard but is commonly used to describe the behaviour.

- Stoyan Stefanov, "JavaScript Patterns"

एक पक्ष पढ़ने के रूप में, सुरक्षित शेफर्ड से this लेख जोड़ने:

रूप Stoyan Stefanov अपनी पुस्तक "जावास्क्रिप्ट पैटर्न" में बताते हैं, उत्थापन जावास्क्रिप्ट दुभाषिया के कार्यान्वयन का एक परिणाम है।

+0

यह एक और शानदार जवाब है और मैं इसमें समय डालने और इस महान पुस्तक का संदर्भ देने के लिए धन्यवाद देना चाहता हूं। मैंने स्टोयान द्वारा जावास्क्रिप्ट पैटर्न बुक के बारे में सुना है और यह मेरे रडार पर है क्योंकि मैं जावास्क्रिप्ट के बारे में और जानता हूं। उत्तर के लिए धन्यवाद, मैंने पहले से ही सही के रूप में जिफ्रेंड को चिह्नित किया है, लेकिन मैं आपका जवाब दूंगा और फिर इसके लिए धन्यवाद! –

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