2012-08-13 18 views
7

में स्थानीय स्कोप मैं Object-Oriented JavaScript by Stoyan Stefanovसमझौता वैश्विक और जावास्क्रिप्ट

उन्होंने एक उदाहरण के वैश्विक और स्थानीय गुंजाइश की तुलना प्रदान करता है का उपयोग कर जावास्क्रिप्ट सीखने किया गया है:

var a = 123; 
function f() { 
    alert(a); 
    var a = 1; 
    alert(a); 
} 
f(); 

इस उदाहरण को देखते हुए, मैं पहली बार चेतावनी के लिए उम्मीद '123' और दूसरा चेतावनी '1' होना चाहिए। लो और निहारना, Stoyan का कहना है:

आपको लगता है कि पहले चेतावनी() 123 ( का मूल्य वैश्विक चर एक) को प्रदर्शित करेगा उम्मीद कर सकते हैं और दूसरे को प्रदर्शित करेगा 1 (स्थानीय क)। यह मामला नहीं है। पहली चेतावनी "अपरिभाषित" दिखाएगी। यह है क्योंकि फ़ंक्शन के अंदर स्थानीय स्कोप वैश्विक दायरे से अधिक महत्वपूर्ण है। इसलिए एक स्थानीय चर के साथ किसी भी वैश्विक चर को ओवरराइट करता है। पहली चेतावनी के समय() को अभी तक परिभाषित नहीं किया गया था (इसलिए मान अपरिभाषित) लेकिन यह अभी भी स्थानीय स्थान पर मौजूद है।

स्पष्टीकरण मुझे स्पष्ट नहीं था, स्थानीय चर पहली वैश्विक चेतावनी में वैश्विक चर को कैसे ओवरराइट कर सकता है? किसी भी अन्य/अलग स्पष्टीकरण की सराहना की जाएगी।

उत्तर

8

यह वैश्विक चर को ओवरराइड नहीं कर रहा है। क्या हो रहा है उसे "वेरिएबल होस्टिंग" कहा जाता है। यही है, फ़ंक्शन के शीर्ष पर var a; डाला जाता है।

स्क्रिप्ट इंजन अपनी स्क्रिप्ट में परिवर्तन निम्नलिखित हो:

var a = 123; 
function f() { 
    var a; 
    alert(a); 
    a = 1; 
    alert(a); 
} 
f(); 

सबक सीखने के लिए: इससे पहले कि आप उन्हें इस्तेमाल हमेशा अपने चर घोषणा करते हैं। कुछ लोग फंक्शन के शीर्ष पर अपने सभी चर घोषित करेंगे।

+0

धन्यवाद जुआन को दिखाने के लिए। मैं अनुमान लगा रहा हूं कि आप लेखकों के ओवरराइट के उपयोग के साथ समस्याएं उठाएंगे? मैंने सोचना शुरू कर दिया कि यह एक गलत नामक बी/सी था अगर मैं समारोह के बाहर चेतावनी (ए) कहता हूं, मुझे '123' मिलता है, जो कोई ओवरराइटिंग नहीं करता है लेकिन दो 'ए' चर, एक वैश्विक और एक स्थानीय। –

+3

ओवरराइड सही शब्द नहीं है, स्थानीय चर ** ** वैश्विक चर को छायांकित करता है, लेकिन वास्तविक समस्या यह समझना है कि यदि आपके पास फ़ंक्शन के भीतर कहीं भी 'var' है, तो वैश्विक ** ** पूरे ** छायांकित है पूरे समारोह, इसे घोषित करने से पहले भी। –

+0

धन्यवाद, यह उपयोगी और स्पष्टीकरण –

1

सरल शब्दों में, दोनों चर और कार्यों के सभी घोषणाओं को पहले माना जाता है। इसलिए स्थानीय var a प्रभाव में केवल वैश्विक दायरे में वैश्विक चर को ओवरराइड करेगा और उसके पास कोई मूल्य नहीं होगा i.e. undefined। तो पहली चेतावनी undefined दिखाएगी। दूसरी चेतावनी 1 दिखाएगी क्योंकि यह a = 1 के बाद है। यह स्थानीय स्तर पर और वैश्विक परिवर्तनीय होता है, एक मूल्य 123 होगा - यह बदला नहीं जाएगा।

एक और उदाहरण फंक्शन का उपयोग करके यह कैसे काम करता

function show(){ 
    alert("I am global"); 
} 

function f() { 

    show(); 

    show = function(){ 
     alert("I am second"); 
    } 

    show(); 

    function show(){ 
     alert("I am first"); 
    } 

} 
f(); 
show(); 
+0

मुझे नहीं लगता कि यह उदाहरण परिवर्तनीय होस्टिंग को समझने में कैसे मदद करता है, आपके पास स्थानीय var भी नहीं है। उत्तर में शब्द सही लगते हैं (हालांकि भ्रमित), लेकिन उदाहरण यह अतिरिक्त भ्रमित करता है –

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