2015-11-22 8 views
14

मेरे पास जावास्क्रिप्ट स्कॉइंग के बारे में कुछ समझ है - कि भाषा में फ़ंक्शन-स्तरीय दायरा है और चर और फ़ंक्शन घोषणाएं उनके दायरे के शीर्ष पर फिसल गई हैं।जावास्क्रिप्ट स्कॉइंग के साथ भ्रम

इस कंसोल के लिए मान 1 लॉग: हालांकि, मैं क्यों कोड की निम्न दो टुकड़े विभिन्न मूल्यों लॉग ऑन को समझ नहीं सकता

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

और रहस्यमय तरीके से, यह लॉग 10:

var a = 1; 
function b() { 
    a = 10; 
    return;   
} 
b(); 
console.log(a); 

तो हुड के नीचे क्या चल रहा है?

+3

['सख्त उपयोग करें'] (http://stackoverflow.com/questions/1335851/) पहले उदाहरण की तरह एक फ़ंक्शन घोषित करने की अनुमति नहीं देगा, इसलिए शायद यह शुरू करने के लिए एक बहुत बुरा विचार है। – transistor09

+0

दिलचस्प है लेकिन यह एक डिजाइन समस्या की तरह है। –

उत्तर

13

मैं पहला उदाहरण और अधिक रहस्यमय ...

दूसरे उदाहरण में मिल जाए, आप समारोह के अंदर एक चर a नहीं घोषित करते हैं। तो जब आप a को असाइन करते हैं, तो यह बाहर a को लक्षित करता है। बहुत सीधा।

पहले उदाहरण में, आप फ़ंक्शन के अंदर एक चर a घोषित करते हैं, लेकिन असामान्य तरीके से: a नामक फ़ंक्शन घोषित करके। तो a को असाइन करने से उस स्थानीय "चर" का उपयोग किया जाएगा।

दो बातें दूर यहाँ लेने के लिए:

एक) चर और समारोह घोषणाओं उनके कार्यक्षेत्र के शीर्ष पर "फहराया" कर रहे हैं। जबकि function a(){} अंत के पास लिखा गया है, परिवर्तनीय a यह पकड़ने के लिए पहले से ही बनाया गया है और दायरे के शीर्ष पर दिखाई देता है।

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

enter image description here

एक टाइपप्रति फ़ाइल में कोड प्रोग्रामिंग:

1

आप कोडिंग के लिए दृश्य-स्टूडियो का उपयोग कर सकते हैं।

enter image description here

यह भी आपको चेतावनी देगा, जब आप चर "एक" करने के लिए संख्यात्मक-मूल्य 10 लागू करने का प्रयास, कि पहले एक समारोह होने के लिए घोषित किया गया। यही कारण है कि मैं टाइपप्रति के बारे में प्यार है, तो आप इसके बारे में यहाँ और अधिक जानकारी प्राप्त कर सकते हैं: http://www.typescriptlang.org/

+0

परिवर्तनीय असाइनमेंट के तहत लाल रेखा के साथ जाने के लिए कोई चेतावनी संदेश है? – Thilo

+2

आपके लिए छवि को रेखांकित – CupawnTae

+0

धन्यवाद @CupawnTae – CoderPi

1

इसकी क्योंकि जब आप एक घोषित function इसे फहराया और एक समारोह अभिव्यक्ति में बदल गया, यानी var a = function() {}; इस के साथ एक टकराव पैदा कर रही है है का उपयोग अपने a चर।

0

जावास्क्रिप्ट दुभाषिया आधारित है। जावास्क्रिप्ट {block} में कोई दायरा नहीं है, लेकिन फ़ंक्शन है।

अपने उदाहरण में,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
console.log(a); 

पहले, आप a आवंटित पूर्णांक 10 हो सकता है, लेकिन अंत में आप एक समारोह गुंजाइश के अंत में गायब हो जाते हैं हो जाएगा कि के रूप में अपने a पुन: असाइन।

इस कोड में,

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function foo() {} 
} 
b(); 
console.log(a); 

अपने a की जगह नहीं है, और वैश्विक क्षेत्र में लौट आए, यह 10 प्रवेश करेंगे।

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