2011-08-26 9 views
5

जब से मैं एक जावास्क्रिप्ट नौसिखिया हूँ, मैं यह सीखने शुरू किया, लेकिन मैं तो बस शुरुआत में अटक गई। मैं a Mozilla Tutorial अनुसरण कर रही हूं और मैं जावास्क्रिप्ट में चर गुंजाइश के साथ एक समस्या है।चर गुंजाइश समस्या

var myvar = "my value"; 

var zmienna = "string"; 

(function() { 
    alert(myvar); 
    alert(zmienna); 
})(); 

(function() { 
    alert(myvar); // undefined 
    var myvar = "local value"; 
    alert(zmienna); 
})(); 

ट्यूटोरियल में, मैंने पढ़ा है कि जावास्क्रिप्ट चर समारोह ब्लॉकों से दिखाई नहीं देते हैं: मैं कुछ कोड है। खैर, पहले दो अलर्ट सही मान कहते हैं। तब यह अजीब बात है, क्योंकि तीसरी चेतावनी "अनिर्धारित" कहती है, इस तथ्य के बावजूद कि पिछले फंक्शन ब्लॉक से कुछ भी नहीं बदला है। चौथा, फिर, सही मूल्य प्रिंट करता है।

किसी को भी मुझे समझा सकते हैं, यहाँ क्या हो रहा है? मैं बहुत खुश हूं, क्योंकि ट्यूटोरियल इसके बारे में और कुछ नहीं कहता है।

+0

_ "मैंने पढ़ा है कि जावास्क्रिप्ट चर से दिखाई नहीं देते फंक्शन ब्लॉक। "_ ट्यूटोरियल में कहां है? वह वाक्य सिर्फ समझ में नहीं आता है। –

उत्तर

1

"मैंने पढ़ा है कि जावास्क्रिप्ट चर फ़ंक्शन ब्लॉक से दिखाई नहीं दे रहे हैं।"

यह बिल्कुल सही नहीं है। वे नेस्टेड कार्यों से उपलब्ध हैं।

नेस्टेड कार्यों एक गुंजाइश श्रृंखला पैदा करते हैं। किसी अन्य फ़ंक्शन के अंदर बनाए गए फ़ंक्शन के अपने चर के साथ-साथ उस फ़ंक्शन के वेरिएबल्स तक पहुंच होती है जिसमें इसे घोंसला लगाया जाता है।

लेकिन समारोह एक नहीं समारोह बी के चर देख सकते हैं समारोह एक नेस्ट नहीं किया गया था अंदर समारोह बी

var myvar = "my value"; // <-- global variable, seen by all functions  
var zmienna = "string"; // <-- global variable, seen by all functions 

(function() { 
    alert(myvar); // <-- referencing the global variable 
    alert(zmienna); // <-- referencing the global variable 
})(); 
(function() { 
    // v--- Declaration of these "local" variables were hoisted to the top... 
    // var myvar; // <--- ...as though it was here. 
    // var new_var; // <--- ...as though it was here. 

    alert(myvar); // undefined (myvar is delcared, but not initialized) 
    alert(new_var); // undefined (new_var is delcared, but not initialized) 

    var myvar = "local value"; // <-- assign the value 

    alert(zmienna); // <-- referencing the global variable 
    alert(myvar); // <-- referencing the local variable 

    var new_var = "test"; // <-- another new local variable 

    // A nested function. It has access to the variables in its scope chain. 
    (function() { 
     alert(myvar); // <-- referencing the variable from its parent func 
     alert(new_var); // <-- referencing the variable from its parent func 
    })(); 
})(); 
/* 
Here's a new function. It was not nested inside the previous function, so it 
    has access to the global variables, and not the locals of the previous func 
*/ 
(function() { 
    alert(myvar); // <-- referencing the global variable 
    alert(new_var); // <-- ReferenceError 
})(); 
+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। अब यह तार्किक प्रतीत होता है। हालांकि, मुझे स्वीकार करना होगा, मेरे लिए, जावास्क्रिप्ट बहुत कठिन है कि अन्य भाषाओं में मुझे कुछ ज्ञान है (मुख्य रूप से सी ++, PHP और एरलांग)। एक बार फिर धन्यवाद। – Radi

+0

@Radi: आपका स्वागत है। मेरे पास एरलांग का कुछ ज्ञान है, लेकिन दूसरे दो नहीं।इस घटना को * shadowing * कहा जाता है, जहां एक नेस्टेड फ़ंक्शन एक वैरिएबल को अपने माता-पिता में एक चर के रूप में घोषित कर सकता है, और इसलिए आप जो मूल्य प्राप्त करते हैं उस पर निर्भर करता है कि घोंसले वाले ब्लॉक के बाद से आप किस स्कोप चेन में हैं पूर्वजों के लिए उपयोग। अगर मुझे याद है, तो एरलांग अपने मजबूत टाइपिंग के कारण छायांकन की अनुमति नहीं देता है, लेकिन मुझे सही ढंग से याद नहीं किया जा सकता है। – user113716

+0

ठीक है, ईमानदार होने के लिए, एरलांग में चर को छाया करना संभव है, हालांकि संकलक आपको इसके बारे में चेतावनी देता है (इसे जांचें: https://gist.github.com/1173877) – Radi

9

var के उपयोग फहराया है।

चूंकि आपके पास फ़ंक्शन के अंदर var myvar है, इसलिए स्थानीय रूप से स्कॉप्ड myvar है। चूंकि आप इसे अलर्ट करने के बाद इसे मान देते हैं, इसलिए जब आप इसे सतर्क करते हैं तो यह undefined है।

+0

ठीक है, धन्यवाद। लेकिन क्यों पहले दो अलर्ट सही मान दिखाते हैं, बावजूद कि ट्यूटोरियल अलग कहता है (जैसा कि मैंने समझा था, थाई था कि "अपरिभाषित" होना चाहिए क्योंकि वे अलग-अलग दायरे में हैं)। क्या आप मुझे समझा सकते हैं? – Radi

+1

क्योंकि आपके पास वैश्विक क्षेत्र में घोषित 'मायवर' और 'zmienna' है। इसलिए स्थानीय स्कोप परिभाषाओं से छिपे हुए नहीं, तो वे आपकी स्क्रिप्ट में कहीं से भी पहुंच योग्य हैं। – J0HN

+0

@Quentin: शायद ओपी बराबर कोड है कि अभी शुरुआत क्या "फहराया" का अर्थ है और कैसे घोषणा फहराया जाता है करने के लिए यह दर्शाता है लेकिन काम नहीं है दिखाते हैं। – user113716

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