2015-05-16 8 views
8
var namepace = (function() { 

    var loca = 5; 

    var getLocal = function() { 
     loca += 1; 
     return loca; 
    }; 

    return { 
     glob: getLocal, 
     blog: loca, 
     frog: function() { 
      return loca; 
     } 
    }; 
})(); 

alert(namepace.glob()); 
alert(namepace.blog); 
alert(namepace.frog()); 

मेरा प्रश्न क्यों समारोह alert(namepace.blog); वापसी 5 बजाय 6 मैं के रूप में उम्मीद करेंगे करता है?Javascript चर गुंजाइश और मूल्य है

उत्तर

6

यहां समझने की महत्वपूर्ण बात यह है कि जावास्क्रिप्ट में सभी नाम अन्य वस्तुओं के संदर्भ हैं।

जब आप ऑब्जेक्ट शाब्दिक के साथ ऑब्जेक्ट बनाते हैं, तो बाईं ओर वाले नामों का उपयोग पहले से ही दाएं हाथ के नाम से संदर्भित वस्तुओं को संदर्भित करने के लिए किया जाता है।

इस मामले में, जब आप

blog: loca, 

आप blog कह रहे हैं जो 5. है मूल्य loca से जाना जाता है, का उल्लेख करने के लिए क्या बाद में जब आप को बढ़ा देते loca पर, यह 6 हो जाता है, यह इसके लिए संदर्भित करता है इसका मतलब है कुछ अन्य मूल्य, लेकिन blog अभी भी 5 मान को संदर्भित करता है।

यही कारण है कि आपको 5 मिल रहा है।

लेकिन आप

namepace.frog() 

करते हैं जब आप वर्तमान मूल्य loca द्वारा नहीं भेजे गए हो रही है। चूंकि में 6 असाइन किया गया है, तो आपको 6 मिल रहा है।

incrementation नया नंबर वस्तु

बनाता है यह और भी स्पष्ट करने के लिए, जब आप

loca += 1; 

या

loca++; 

क्या आंतरिक रूप से होता है, इस

की तरह कुछ
oldValue = loca 
newValue = oldValue + 1 
loca = newValue 

संदर्भ ECMAScript 5.1 से विशिष्टता, += के लिए और ++

के लिए के बाद से संख्या अपरिवर्तनीय वस्तुओं (आप 5 का मूल्य बदल सकते हैं? आप नहीं कर सकते हैं, यही कारण है कि इसे एक अपरिवर्तनीय वस्तु कहा जाता है), इसमें एक जोड़ा गया एक नया नंबर ऑब्जेक्ट बनाया गया है और नई ऑब्जेक्ट को संदर्भित करने के लिए loca नाम बनाया गया है।


परिवर्त्य वस्तुओं

आप परिवर्तनशील वस्तुओं के बारे में सोचते हैं, तो

var namepace = (function() { 

    var loca = []; 

    return { 
     glob: function() { 
      loca.push(1); 
      return loca; 
     }, 
     blog: loca, 
     frog: function() { 
      return loca; 
     } 
    }; 
})(); 

console.log(namepace.glob()); 
// [ 1 ] 
console.log(namepace.blog); 
// [ 1 ] 
console.log(namepace.frog()); 
// [ 1 ] 

अब, दोनों blog और loca एक ही सरणी वस्तु देखें। glob में क्या होता है पर उत्परिवर्तित कहा जाता है।आप केवल दो तत्व blog और loca के साथ संदर्भित सरणी ऑब्जेक्ट में एक तत्व जोड़ रहे हैं। यही कारण है कि namepace.blog भी [ 1 ] प्रिंट करता है।

1

इसकी एक तर्क समस्या है। जब समारोह कुछ समय लेता है। उस समय परिवर्तनीय असाइन किया गया .. कोड नीचे देखो। और इस

var namepace = (function() { 

    var loca = 5; 

    var getLocal = function() { 
     loca += 1; 
     return loca; 
    }; 
    console.log(loca); 

    return { 
     glob: getLocal, 
     blog: loca, 
     frog: function() { 
      return loca; 
     } 
    }; 
})(); 

alert(namepace.glob()); 
alert(namepace.blog); 
alert(namepace.frog()); 
0

जब namespace.blog को सौंपते समय, आप सेटर करने के लिए पास-दर-मूल्य का उपयोग कर रहे प्रयास करें। इसका मतलब है कि loca पर कोई संदर्भ नहीं है।

आप namespace.frog के माध्यम से मूल्य का उपयोग करते हैं, आप मूल चर, जो loca, अगले उपलब्ध परिभाषा स्थानीय गुंजाइश श्रृंखला को हल करने के लिए जावास्क्रिप्ट की क्लोजर scoping लाभ है प्रयोग कर रहे हैं।

आप यहाँ देखते हुए पर पढ़ सकते हैं: What is the scope of variables in JavaScript?

1

यह निष्पादन संदर्भ के बारे में सोच करने के लिए जब एक जावास्क्रिप्ट कार्यक्रम चलाया जाता है में मदद करता है। जावास्क्रिप्ट संदर्भों का मूल्यांकन करता है (सीधे मूल्य नहीं)।

वैश्विक संदर्भ में वैश्विक चर और वस्तुएं शामिल हैं। इस मामले में यह है (उस समय जावास्क्रिप्ट दुभाषिया नाम स्थान अनुदेश पढ़ता है):

namespace = {f} // namespace references a function 

इसका मतलब यह है नाम स्थान में एक समारोह संदर्भित कर रहा है। पहली चेतावनी में नामस्थान के लिए निम्नलिखित निष्पादन संदर्भ बनाया गया है:

loca = 5    // loca references the value 5 
getLocal = {f}   // getLocal references a function 
return {    // return object with glob, blog and frog as properties 
    glob = { getLocal() } // references the function getLocal() 
    blog = 5    // blog references same value as loca: 5 
    frog = {f}   // references anonymous function 
} 

परिणामस्वरूप फ़ंक्शन ग्लोब को कॉल किया जाता है। ग्लोब संदर्भ मिलता है जो GetLocal नामक एक समारोह है। ग्लोब का निष्पादन संदर्भ इस प्रकार है:

loca = 6  // loca now references the value 6 
return loca // return value referenced by loca 

अगला कॉल ब्लॉग है और यह मूल्य 5 देता है। यह लोकेशन का संदर्भ नहीं देता है। यह केवल उस मूल्य का संदर्भ देता है जो निष्पादन संदर्भ बनाते समय लोक था। उस समय निष्पादन संदर्भ को 5 का मान संदर्भित किया गया था, और इस प्रकार ब्लॉग 5 का मान संदर्भित करता है। कोई फर्क नहीं पड़ता कि आप कितनी बार ग्लोब कहते हैं, ब्लॉग अभी भी 5 के मान का संदर्भ देगा।

अंतिम चेतावनी में कथन मेंढक आह्वान किया जाता है। मेंढक एक अज्ञात फ़ंक्शन का संदर्भ देता है जिसे अब निष्पादित किया गया है। मेंढक का निष्पादन संदर्भ निम्नानुसार है

return loca // Go and get the value that is referenced by loca 

यह मूल रूप से यह है। जब भी आपको लगता है कि "मूल्य के संदर्भ" को सोचने का प्रयास करें। इससे इसका उपयोग करने में मदद मिल सकती है। और जब कोई प्रोग्राम चलाया जाता है (जैसे मानव डीबगर होने पर निष्पादन संदर्भों को देखने की कोशिश करें)।

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