यह बहुत सरल है: जे एस वर्तमान क्षेत्र के शीर्ष करने के चर घोषणाओं फहराने, लेकिन किसी भी परिचालन (कार्य भी शामिल है) नहीं हैं फहराया (एक ही दायरे में, दूसरे मामले स्पष्टीकरण देखें), ज़ाहिर है। तो अपने टुकड़ा
(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
}());
स्रोत
2012-11-29 12:53:05
+1 खैर phrased और स्पष्ट उत्तर नहीं। – Aesthete
+1 वास्तव में आपके लिए महोदय। –
@bfavaretto: मुझे लगता है कि 'var ग्रीटिंग' एक त्रुटि थी, और इसे 'var currentSize' ग्लोबल वेरिएबल घोषणा (जिसे पहले उदाहरण में दिखाया गया था, और दूसरे में उपयोग किया गया था) माना जाता था। अन्यथा यह उदाहरण के लिए पूरी तरह से अप्रासंगिक होगा। – Amadan