2010-07-27 9 views
7

क्या कोई मुझे बता सकता है कि 'x' का अंतिम लॉगिंग 0 के बराबर क्यों है और नहीं 1। मैंने सोचा क्योंकि इसे किसी फ़ंक्शन के बाहर घोषित किया गया है, इसका वैश्विक दायरा है और फिर फ़ंक्शन में यह मान सेट है 1 तक और वह मान बनी रहेगी क्योंकि यह वैश्विक है? मुझे पता है कि फ़ंक्शन के अंदर पहला 'x' मान वैश्विक है क्योंकि विभिन्न कीवर्ड के बिना घोषित कोई वैरिएबल विंडो ऑब्जेक्ट की संपत्ति बन जाता है। बहुत धन्यवादऔर मैंने सोचा कि मुझे स्कोप

var x = 0; //global variable 

function y(){ 
    x = 1; 
    log("1. %n ", x);//1. 1 

    var x = 2; 
    log("2. %n ", x);//2. 2 
} 

y(); 
log("3. %n ", x);//3. 0 

उत्तर

6

var बयान उत्थापन का विषय है, जब आपके कोड मूल्यांकन किया जाता है यह वास्तव में इस तरह दिखता है:

var x = 0; //global variable 
function y(){ 
    var x; // local!! 

    x = 1; 
    log("1. %n ", x);//1. 1 

    x = 2; 
    log("2. %n ", x);//2. 2 
} 

y(); 
log("3. %n ", x);//3. 0 

बस y से पहले मार डाला जाता है, एक नया निष्पादन संदर्भ सेटअप है, और Variable Instantiation प्रक्रिया लेता है से पहले कार्य निष्पादित किया गया है।

जेएसलिंट वास्तव में क्या हो रहा है, जैसा दिखने के लिए प्रति कार्य केवल एक var कथन की सिफारिश करता है, यही कारण है।

+0

धन्यवाद आदमी। उत्तर के लिए हमेशा आप पर जवाब दे सकते हैं। – screenm0nkey

+0

आपका स्वागत है @ निक, मुझे मदद करने में खुशी है! – CMS

1

मैं लगता , लेकिन ECMAScript कल्पना के माध्यम से इस बात की पुष्टि नहीं कर सकते, कि "var x = 2" लाइन समारोह परिभाषा समय में स्कैन किया जाता है, और की "x" स्थानीय गुंजाइश पूरे के लिए लागू होता है फ़ंक्शन में "var x" पंक्ति की स्थिति के ठीक बाद नहीं।

js>x = 0; 
0 
js>function foo(k) { x=k; } 
js>function bar(k) { var x=k; } 
js>function baz(k) { x=k; var x=2; } 
js>foo(1) 
js>x 
1 
js>bar(2) 
js>x 
1 
js>baz(3) 
js>x 
1 

आप ध्यान दें हूँ कि प्रभावित करता है केवल समारोह यहां वैश्विक "x" foo() है:

यहाँ एक सरल परीक्षण का मामला (jsdb के माध्यम से परीक्षण किया) है। फ़ंक्शन bar() स्पष्ट रूप से केवल स्थानीय x को प्रभावित करता है। लेकिन फ़ंक्शन baz() केवल स्थानीय एक्स को भी प्रभावित करता है। आपको लगता है कि असाइनमेंट x=k; वैश्विक x को प्रभावित करेगा, क्योंकि यह अगले कथन var x = 2; से पहले "पहले" होता है जो स्पष्ट रूप से स्थानीय चर x को प्रभावित कर रहा है। लेकिन मुझे पूरा यकीन है कि यदि आप किसी फ़ंक्शन में var x करते हैं, तो दुभाषिया इसे देखता है और इसे पर सभी उस दायरे में एक्स के उपयोग पर लागू करता है। तुम्हारी जैसी ही स्थिति।

5

चर x समारोह के अंदर तुरंत बनाई गई है जब समारोह निष्पादित किया जाता है और variable statement के साथ लाइन तक पहुँच जाता है जब नहीं:

चर बयान एक FunctionDeclaration अंदर होता है, तो चर हैं उस समारोह में फ़ंक्शन-स्थानीय स्कोप के साथ परिभाषित [...]। निष्पादन दायरे दर्ज होने पर चर बनाए जाते हैं। [...] बनाए गए समय अपरिभाषित के लिए वैरिएबल प्रारंभ किए गए हैं। [...]

आप देख सकते हैं कि x जब पहला काम के सामने एक log कॉल जोड़ने शुरू में undefined है:

function y(){ 
    log("0. " + x);//0. undefined 
    x = 1; 
    log("1. " + x);//1. 1 
    var x = 2; 
    log("2. " + x);//2. 2 
} 

दोनों कार्य समारोह के अंदर समारोह में x का उल्लेख इसका मतलब है कि वैश्विक दायरे में स्थानीय दायरे और x पर नहीं।

+0

+1 हां, और सीएमएस के उत्तर को भी देखें क्योंकि यह गायब शब्द "hoisting" का उपयोग करता है। –

+0

+1 धन्यवाद आदमी।बस जब मुझे लगता है कि मुझे पता है कि जावास्क्रिप्ट के साथ क्या चल रहा है तो कुछ और मुझे रोक देता है। एक महान जवाब के लिए धन्यवाद। – screenm0nkey

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

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