2012-11-29 15 views
6

निम्न कोड में:redeclare JavaScript वेरिएबल

var greeting = "hi"; 

function changeGreeting() { 
    if (greeting == "hi") { 
     var greeting = "hello"; 
    } 

    alert(greeting); 
} 

changeGreeting();​ 

... greeting अनिर्धारित रहता है। लेकिन अगर मैं var को हटाने और इस के लिए changeGreeting() बदलने के लिए:

function changeGreeting() { 
    if (greeting == "hi") { 
     greeting = "hello"; 
    } 

    alert(greeting); 
} 

... मैं "हैलो" के रूप में उम्मीद मिलता है।

मैं कभी भी इस तरह के एक चर को अपने कोड में दोबारा नहीं बदलूंगा, लेकिन ऐसा क्यों होता है?

उत्तर

27

जावास्क्रिप्ट चर के कार्यक्षेत्र का दायरा है। इस प्रकार, फ़ंक्शन के अंदर var greeting की उपस्थिति स्थानीय greeting वैरिएबल घोषित करेगी, जो if स्थिति में इसके उल्लेख के समय अपरिभाषित होगी: वैश्विक चर को फ़ंक्शन के अंदर दिखाई नहीं देगा, स्थानीय स्थानीय द्वारा छायांकित किया जा रहा है। इसलिए, if नहीं होता है, hello पर असाइनमेंट नहीं होता है, चर स्थिर अभी भी अनिर्धारित है।

दूसरे उदाहरण में, आप वैश्विक चर का उपयोग कर रहे हैं, यह स्थानीय चर (क्योंकि, var greeting फ़ंक्शन के अंदर) द्वारा छायांकित नहीं है, और चीजें आपके काम की अपेक्षा करते हैं।

+3

+1 खैर phrased और स्पष्ट उत्तर नहीं। – Aesthete

+0

+1 वास्तव में आपके लिए महोदय। –

+0

@bfavaretto: मुझे लगता है कि 'var ग्रीटिंग' एक त्रुटि थी, और इसे 'var currentSize' ग्लोबल वेरिएबल घोषणा (जिसे पहले उदाहरण में दिखाया गया था, और दूसरे में उपयोग किया गया था) माना जाता था। अन्यथा यह उदाहरण के लिए पूरी तरह से अप्रासंगिक होगा। – Amadan

-1

अपने पहले कोड स्निपेट में, आप वैश्विक चर की जांच कर रहे हैं, जो मौजूद नहीं है -> स्थिति को पास नहीं करता है।

इस जावास्क्रिप्ट स्कोप और कैसे चर के साथ काम करने के लिए पर बाहर की जाँच करें Javascript garden - function scopes

+1

के लिए धन्यवाद पहला स्निपेट वैश्विक चर की जांच नहीं कर रहा है, फ़ंक्शन बॉडी में उस चर के 'var' घोषणा है, जो शीर्ष पर फिसल गई है। यह एक स्थानीय 'var currentLength;' <- अपरिभाषित चर है जो फ़ंक्शन रिटर्न के बाद GC'ed है –

+0

आह, आप सही हैं। मैंने पूरी तरह से उछाल को खाली कर दिया:/ – rdamborsky

6

यह बहुत सरल है: जे एस वर्तमान क्षेत्र के शीर्ष करने के चर घोषणाओं फहराने, लेकिन किसी भी परिचालन (कार्य भी शामिल है) नहीं हैं फहराया (एक ही दायरे में, दूसरे मामले स्पष्टीकरण देखें), ज़ाहिर है। तो अपने टुकड़ा

(function() 
{ 
    var currentSize;//undefined 
    if (currentSize == 'hi')//always false 
    { 
     currentSize = 'hello';//assignment that will never be 
    } 
    alert(currentSize);//alerts undefined, of course 
}()); 

लिए अनुवाद किया है वर बाहर छोड़ने पर गुंजाइश स्कैनिंग करने के लिए आय (चर के लिए जाँच वैश्विक क्षेत्र में घोषित किया गया)। अफसोस की बात है, ऐसा करने में, var के पहले उपयोग का संदर्भ खो गया है (एक शाखा के अंदर), और असाइनमेंट भी फहराया जाता है। एक अंतर्निहित वैश्विक का अनुवाद :
भगवान का शुक्र है यह सच नहीं है। मुझे लगता है कि यह था, क्योंकि मैंने कंसोल में कुछ चीजों का परीक्षण किया जो इस बात की पुष्टि करता था। इस मामले में @amadan सही है: जब आप इसे पोस्ट करते हैं तो आप ग्लोबल वेरिएबल (greeting को अपने स्निपेट में गलती से इस्तेमाल कर रहे हैं) का उपयोग कर रहे हैं। मैं नीचे दिए गए कोड को छोड़ने जा रहा हूं (इसे सही किया गया है) यह दिखाने के लिए कि वास्तव में क्या अंतर्निहित ग्लोबल्स हैं, उम्मीद है कि यह किसी को जेएस में स्कॉप्स/स्कोप-स्कैनिंग को समझने में कभी-कभी मदद करता है।

var currentSize = 'hello'; 
//well, actually implied globals can be deleted, so it's more like 
Object.defineProperty(this,'currentSize',{value:undefined, 
              writable:true, 
              enumerable:true, 
              configurable:true}); 
(function() 
{ 
    if (currentSize == 'hi')//always false 
    {//this still doesn't get executed 
     currentSize = 'hello';//assignment that will never be 
    } 
    alert(currentSize);//alerts undefined 
}()); 
+0

परिवर्तनीय दायरे पर एक स्पष्ट रूप से समझाया गया जवाब मैंने जेएस में परिवर्तनीय दायरे के बारे में मेरी अवधारणा को सुधारने के लिए बहुत कुछ सीख लिया –

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