2013-01-02 9 views
6

मैं जावास्क्रिप्ट के साथ एक अजीब दायरे मुद्दे में चला रहा हूँ (JSFiddle देखें):जावास्क्रिप्ट वैश्विक चर गुंजाइश मुद्दा

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    var someGlobal = 5; 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Displays 3, why? 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

क्यों जावास्क्रिप्ट someF2() में एक अपरिभाषित मुद्दा फेंकता नहीं करता है? someF2() कैसे someGlobal, और someF() तक पहुंच सकते हैं? मैं कैसे सुनिश्चित कर सकता हूं कि किसी फ़ंक्शन में वैश्विक चर पहुंच योग्य है?

टिप्पणी:

दोनों मामलों में, कार्यों alert(someglobal) फोन करके शुरू करते हैं, यही कारण है कि एक समारोह एक अपरिभाषित मुद्दे और अन्य फेंक नहीं है?

उत्तर

7

someFsomeGlobal नामक एक नया (स्थानीय रूप से स्कॉप्ड) वैरिएबल बनाता है (जो वैश्विक someGlobal मास्क करता है) और इसे मान देता है। यह वैश्विक someGlobal को स्पर्श नहीं करता है (हालांकि इसे एक्सेस नहीं किया जा सकता है क्योंकि दायरे में एक ही नाम वाला एक और चर है)।

var बयान फहराया जाता है, ताकि someGlobalsomeF के सभी के लिए छिपा होता है (न सिर्फ var बयान के बाद)। स्थानीय someGlobal का मान undefined है जब तक कोई मान निर्दिष्ट नहीं किया जाता है।

someF2 मूल (अप्रचलित) वैश्विक someGlobal तक पहुंचें।

+0

+1 लेकिन अधिक वर्णित करें कि ग्लोबल वैरिएबल स्थानीय चर द्वारा फ़ंक्शन में ओवरराइट हो जाता है: D –

+0

यह ओवरराइट नहीं होता है, यह मुखौटा हो जाता है। – Quentin

+0

अच्छी तरह से आप मुझे दोनों के बारे में थोड़ा सा स्पष्टीकरण दे सकते हैं! मैंने इस पर शोध नहीं किया है! केवल उस समारोह के लिए इसे ओवरराइट किया जाता है या नहीं? –

4

चूंकि आप एक ही नाम के साथ एक स्थानीय चर घोषित कर रहे हैं। तो यह स्थानीय चर के लिए मान असाइन करता है। कुछएफ() में var varGlobal से var को हटा दें और यह ठीक होना चाहिए।

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    someGlobal = 5; // <-- orignially var someGlobal = 5 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Should display 5 now 
    alert(someGlobal); 
} 

someF(); 
someF2(); 
1

someF2 प्रदर्शित करता है 3, क्योंकि यह अभी भी 3.

someF में() आप एक नया चर कि someGlobal के वही नाम हैं करने के लिए होता पैदा करते हैं। यह मूल कुछ ग्लोबल के लिए कुछ भी नहीं करता है, यह सिर्फ एक नया चर स्थानीय रूप से बनाता है जो कि फ़ंक्शन समाप्त होने पर दूर जाता है।

तो आपके पास स्थानीय चर (जैसे var के साथ कुछ एफ के अंदर बनाया गया) और वैश्विक हैं।

+0

ठीक है, लेकिन कारण है कि मैं अन्य नहीं एक मामले में एक अपरिभाषित मुद्दा हो और करते हैं? यह मेरा सवाल है। – JVerstry

+0

मुझे लगता है कि क्वांटिन ने अब समझाया है। सर्वोत्तम उत्तर के लिए –

-1

this का उपयोग कर someF के अंदर स्थानीय और वैश्विक चर दोनों का उपयोग करने का उदाहरण यहां दिया गया है।

var someGlobal = 3; 

function someF() { 

    // Displays 3 
    alert(someGlobal); 
    this.someGlobal = 5; 
    someGlobal = 5; 
    // Displays 5 
    alert(this.someGlobal); 
} 

function someF2() { 
    // Displays 5 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

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