2013-11-26 9 views
18

मैं अगर मैं जैसे कि निम्न से पहले ही परिभाषित किया गया है जे एस में एक चर का उपयोग कर सकते हैं, थोड़ी देर के लिए सोच कर दिया गया है:जावास्क्रिप्ट में, क्या मैं इसे घोषित करने से पहले एक चर का उपयोग कर सकता हूं?

var country = "USA"; 
switch (country) { 
    case "USA": 
     country = i; 
    case "blach": 
     //not finished yet 
} 
/* 
    put a whole 
    bunch more code here 
*/ 
var i = 10; 

इस मान्य है? क्या इसकी अनुमति है? और यदि हां, तो इसके लिए तकनीकी शब्द क्या है?

+0

क्षमा करें, लेकिन मुझे लगा कि यह प्रश्न "पर्याप्त शोध प्रयास नहीं दिखाता" है। [परिवर्तनीय दायरा] (http://en.wikipedia.org/wiki/Scope_ (computer_science) # जावास्क्रिप्ट) मौलिक प्रोग्रामिंग ज्ञान है। प्रश्न में कोड को चलाने से साबित होना चाहिए कि इसकी अनुमति है। प्रश्न शायद "घोषित होने से पहले चर का उपयोग करने के लिए तकनीकी शब्द क्या है"। प्रश्न को संपादित करने के लिए स्वतंत्र महसूस करें और डाउनवोट दूर जा सकता है। मैं बताउंगा कि यहां तक ​​कि [यह] (http://stackoverflow.com/questions/500431/javascript-variable-scope) जावास्क्रिप्ट प्रश्न में _hoisting_ का कोई उल्लेख नहीं है। – andyb

उत्तर

19

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

var country; 
var i; 

country = "USA"; 
switch (country) { 
case "USA": 
    country = i; 
case "blach": 
    //not finished yet 
} 

i = 10; 

तो, iघोषित पूरे दायरे भर है, लेकिन अपने मूल्य undefinedi = 10 बयान रन तक है।

ईसीएमएस्क्रिप्ट शर्तों में, जब कोई फ़ंक्शन लागू किया जाता है, तो फ़ंक्शन का नया लेक्सिकल स्कोप किसी भी फ़ंक्शन के कोड चलाने से पहले VariableEnvironment बनाता है। ECMAScript 10.5, step 8 में:

8. लिए कोड में प्रत्येक VariableDeclaration ... , स्रोत पाठ क्रम में

एक है। डीएन डी में पहचानकर्ता बनें।

...

मैं। env की CreateMutable बाइंडिंग कंक्रीट विधि डीएन और कॉन्फ़िगर करने योग्य बाइंडिंग तर्क के रूप में कॉल करें।

ii। env की सेटमैटबल बाइंडिंग कंक्रीट विधि डीएन, undefined, और सख्त तर्क के रूप में गुजरती है।

यह काफी एक कौर है, लेकिन मूल रूप से यह कहते हैं:

इससे पहले कि आप एक समारोह चलाने के लिए, var [identifierName] तरह घोषणाओं के लिए समारोह के स्रोत कोड के माध्यम से देखो।

प्रत्येक घोषणा आप पाते हैं, नाम [identifierName] घोषणा में उपयोग किए जाने वाले समारोह के दायरे में एक नया वेरिएबल बनाने और उसके बाद के लिए undefined

+1

अच्छा है कि आपने इसके लिए 10.5.8 +1 का संदर्भ जोड़ा है :) – C5H8NNaO4

3

हां। जावास्क्रिप्ट में चर hoisted

हैं एक चर बयान चर के रूप में 10.5 में परिभाषित बनाए जाते हैं की घोषणा की। बनाया गया जब चर को अपरिभाषित करने के लिए प्रारंभ किया गया है। एक प्रारंभकर्ता के साथ एक चर को इसके असाइनमेंट एक्स्प्रेशन का मान असाइन किया जाता है जब वेरिएबलस्टेटमेंट निष्पादित किया जाता है, जब चर बनाया जाता है। ES5 §12.2
कहाँ 10.5 चरण 8 ब्याज

5

यह variable hoisting कहा जाता है का हिस्सा है, और इसे समझने की के रूप में यह कभी कभी कीड़े कि नीचे ट्रैक करने के लिए कड़ी मेहनत कर रहे हैं बना सकते हैं एक अच्छा अवधारणा है।

उदाहरण के लिए:

var stuff = 'stuff'; 
function() { 
console.log(stuff); //outputs 'undefined' 
var stuff = 'other stuff'; 
console.log(stuff); //outputs 'other stuff' 
} 

पहले console.log आउटपुट undefined क्योंकि समारोह में वर stuffथा समारोह के शीर्ष करने के फहराया।

//theoretical compiled output 
var stuff = 'stuff'; 
function() { 
var stuff; //has not been defined 
console.log(stuff); 
stuff = 'other stuff'; //defined here 
console.log(stuff); 
} 

परिवर्तनीय उत्थान के ज्ञान के बिना, यह परिणाम भ्रमित हो सकता है।

इस कारण से, यदि आप व्यावसायिक रूप से विकसित जावास्क्रिप्ट कोड देखते हैं, तो आमतौर पर आप देखेंगे कि फ़ंक्शन में सभी चर शीर्ष पर घोषित किए गए हैं।

2

लोग उत्तर सही हैं करने के लिए अपने मूल्य निर्धारित किया है। आपके उदाहरण के लिए हालांकि यह ध्यान देने योग्य है कि countryundefined है। के रूप में उल्लेख किया है aspillers अपने कोड

var country; 
var i; 

country = "USA"; 

switch (country) { 
case "USA": 
    country = i; 
case "blach": 
    //not finished yet 
} 

i = 10; 
alert(country) //undefined; 

लेकिन जब अपने case बयान "संयुक्त राज्य अमेरिका के लिए" दौड़ा, i तो यह country को सौंपा गया था अपरिभाषित था नीचे के रूप में व्यवहार करता है। इसे fiddle में आजमाएं।

मुझे लगता है कि आपको केवल यह पता होना चाहिए कि यद्यपि परिवर्तनीय घोषणाएं फेंक दी गई हैं, मान असाइनमेंट नहीं हैं।

+0

मैं 'JS' के लिए नया हूं इसलिए मुझे बहुत कुछ पता नहीं है। माफी, लेकिन मुझे क्या समझा गया कि 'hoisting' का मतलब है कि मौजूदा क्षेत्र में' var' कहां हो सकता है; निष्पादन शुरू होने से पहले इसे स्मृति आवंटित किया जाएगा। तो चर क्यों अपरिभाषित है? –

+1

@ विकसबंसल - केवल संदर्भ फहराया गया है। एक मूल्य का असाइनमेंट नहीं किया जाता है। तो उदाहरण में 'देश = i' स्विच स्टेटमेंट में सिर्फ देश को अपरिभाषित कर रहा है क्योंकि 'i' का मान अंत में सही है –

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

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