इस घटना को इस प्रकार से जाना जाता है: जावास्क्रिप्ट परिवर्तनीय उत्थापन ।
किसी भी बिंदु पर आप अपने फ़ंक्शन में वैश्विक चर तक नहीं पहुंच रहे हैं; आप केवल कभी-कभी स्थानीय value
चर पर पहुँच रहे हैं ।
आपका कोड निम्नलिखित के बराबर है:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
फिर भी आप हैरान हो रहे हैं undefined
?
स्पष्टीकरण:
यह कुछ ऐसा है जो हर जावास्क्रिप्ट प्रोग्रामर को जल्द या बाद में टक्कर देता है। सीधे शब्दों में कहें, तो आप जो भी चर घोषित करते हैं, वह हमेशा आपके स्थानीय बंद के शीर्ष पर फहराया जाता है। इसलिए, भले ही आपने पहली console.log
कॉल के बाद अपना वैरिएबल घोषित किया हो, फिर भी यह माना जाता है कि आपने इससे पहले इसे घोषित किया था।
हालाँकि, केवल घोषणा का हिस्सा फहराया जा रहा है; दूसरी ओर, असाइनमेंट, नहीं है।
इसलिए, जब आपने पहली बार फोन किया था console.log(value)
, तो आप अपने स्थानीय रूप से घोषित चर का संदर्भ दे रहे थे, जिसे अभी तक कुछ भी नहीं सौंपा गया है; इसलिए undefined
।
यहाँ एक और उदाहरण है :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
आपको क्या लगता है कि यह अलर्ट करेगा? नहीं, बस पर नहीं पढ़ें, इसके बारे में सोचो। का मूल्य क्या है test
?
अगर आपने इसके अलावा कुछ भी कहा start
, तो आप गलत थे। उपरोक्त कोड इसके बराबर है:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
ताकि वैश्विक वैरिएबल कभी प्रभावित न हो।
जैसा कि आप देख सकते हैं, कोई फर्क नहीं पड़ता कि आपने अपनी परिवर्तनीय घोषणा कहां रखी है, यह हमेशा आपके स्थानीय बंद होने के शीर्ष पर फहराया जाता है।
पक्षीय लेख:
यह फ़ंक्शन पर भी लागू होता है।
कोड के इस टुकड़े पर विचार करें :
test("Won't work!");
test = function(text) { alert(text); }
जो आपको एक संदर्भ त्रुटि देगा:
बिना संदर्भित संदर्भ: परीक्षण परिभाषित नहीं है
यह बहुत सारे डेवलपर्स को बंद कर देता है, क्योंकि कोड का यह टुकड़ा ठीक काम करता है:
test("Works!");
function test(text) { alert(text); }
जैसा कि कहा गया है, इसका कारण यह है कि असाइनमेंट का हिस्सा फहराया नहीं गया है । इसलिए पहले उदाहरण में, जब test("Won't work!")
चलाया गया था, test
चर पहले ही घोषित किया जा चुका है, लेकिन अभी तक इसे सौंपा गया कार्य नहीं है।
दूसरे उदाहरण में, हम चर असाइनमेंट का उपयोग नहीं कर रहे हैं। बल्कि, हम उचित समारोह घोषणा वाक्य रचना है, जो प्रयोग कर रहे हैं करता समारोह पूरी तरह से फहराया मिलता है।
बेन चेरी ने इस पर एक उत्कृष्ट लेख लिखा है, जिसे उचित रूप से जावास्क्रिप्ट स्कोपिंग और उत्थापन शीर्षक दिया गया है ।
इसे पढ़ें। यह आपको पूरी जानकारी विस्तार से देगा।