2012-07-12 5 views
8

अगर मैं ऐसा करते हैं:स्थानीय जावास्क्रिप्ट scoping मुद्दा

var a = 0; 

(function() { 
    var a = a; //want to make local a = global a 
    ++a; 
    console.log("fn",a); 
})(); 

console.log(a);​ 

उत्पादन होता है:

fn NaN 
0 

क्यों a स्वयं फ़ंक्शन को निष्पादित करने के अंदर NaN बन जाता है?

मैं जानता हूँ कि यह ठीक काम करता है, तो मुझे क्या करना:

(function() { 
    var b = a; 
    ++b; 
    console.log("fn",b); // fn 1 
})(); 

लेकिन अगर मैं पहले संस्करण का रास्ता तय है, यह NaN मुद्दा है।

ऐसा क्यों हो रहा है?

+0

मुझे यकीन है कि क्यों यह है कि करता है, लेकिन मैं 'का उपयोग कर वर एक = window.a' की कोशिश की नहीं कर रहा हूँ और यह उपयुक्त तरीके से व्यवहार – Ibu

+0

@Ibu हममम कि अजीब है ... – Neal

+0

क्योंकि सभी वैश्विक चर खिड़की गुंजाइश – jagm

उत्तर

10

var a = a; वास्तव में परिवर्तनीय hoisting के कारण var a; a = a; है। इसका मतलब है कि असाइनमेंट के समय पुराने a पहले से ही नए द्वारा छायांकित है (जो undefined है)।

से बचने के लिए इस तरह के मुद्दों के एक पैरामीटर के रूप मूल्य गुजर रहा है सबसे आसान तरीका:

(function (a) { 
    ++a; 
    console.log("fn",a); 
})(a); 

मामले a में एक वैश्विक चर आप भी var a = window.a;woz suggested की तरह इस्तेमाल कर सकते हैं है - लेकिन जब से वैश्विक चर होने आमतौर पर एक है खराब विचार पैरामीटर के साथ बेहतर रहना।

+0

में हैं तो कैसे होगा मैं इसे इतना बनाता हूं कि स्थानीय फ़ंक्शन स्कोप की शुरुआत में मेरा स्थानीय चर और वैश्विक चर बराबर है? क्या मुझे एक अस्थायी चर का उपयोग करने की आवश्यकता है? – Neal

+1

मेरा संपादन देखें। आप इसके लिए अस्थायी चर का उपयोग नहीं कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं, जैसे ही आपके कार्य में 'var a' होता है, बाहरी' ए 'अब तक पहुंच योग्य नहीं है। – ThiefMaster

+0

ओहह मैं पैरामीटर के बारे में भूल गया :-P Duuuuh। '+ 1' – Neal

0

जावास्क्रिप्ट में एक चर उत्थापन, वहाँ है तो अपने कोड के दौरान इस तरह दिखता है पर अमल: तो सबसे पहले आप स्थानीय चर एक के रूप में अपरिभाषित और फिर आप चर एक

5

The To अपरिभाषित आवंटित

(function() { 
    var a; 
    a = a; //want to make local a = global a 
    ++a; 
    console.log("fn",a); 
})(); 

a आपकी फ़ंक्शन अभिव्यक्ति छाया के अंदर परिवर्तनीयa बाहरी दायरे पर घोषित चर।

यह NaN हो जाता है काम में के बाद से:

var a = a; 

दाईं ओर a यह वास्तव में स्थानीय दायरे में a की चर्चा करते हुए है।

फ़ंक्शन वास्तव में निष्पादित होने से पहले परिवर्तनीय घोषणाएं की जाती हैं, इसे आमतौर पर 'hoisting' के रूप में जाना जाता है।

के बाद से यह एक ही चर है, यह undefined मूल्य रखती है, और जब आप इस मान को किसी भी संख्या को जोड़ने का प्रयास है, यह NaN हो जाता है:

console.log(undefined + 0); 
2

जावास्क्रिप्ट में, वर्तमान execution context (जो जैसी चीज़ें शामिल हैं परिवर्तनीय दायरा) से पहले स्थापित किया गया है आपका कोड निष्पादित शुरू होता है।

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

अगला, आपका कोड वास्तव में निष्पादन शुरू होता है। a लेबल वर्तमान निष्पादन संदर्भ में पहले से ही आरक्षित है, इसलिए var a = a; बस स्थानीय a (जो अपरिभाषित) को असाइन करता है।

var a = window.a काम करता है क्योंकि आप सीधे वैश्विक दायरे तक पहुंच करके दायरे के मुद्दे को दूर करते हैं। हालांकि, यह गैर-ब्राउज़र वातावरण (जैसे नोड) में काम नहीं करता है क्योंकि window नहीं है; नोड में वैश्विक वस्तु global है।