2010-02-27 8 views
6

बंद करने में एक स्थानीय कार्य एक वैरिएबल को उसी नाम से घोषित करता है जो बंद होने में मौजूद है। तो, हम स्थानीय फ़ंक्शन से क्लोजर के चर को कैसे एक्सेस कर सकते हैं?विशिष्ट बंद करने और स्थानीय चर

function closure() 
{ 
    var xVar; 
    function func1() 
    { 
     var xVar; 
     // how to distinguish local and closure scopes. 
     return xVar; 
    } 
    return function() { return func1(); }; 
} 

एक निजी वस्तु बनाना और निजी वस्तुएं बनाना इस वस्तु के गुणों के रूप में मदद कर सकता है। लेकिन मैं सोच रहा हूं कि क्या एक बेहतर और साफ समाधान है। क्या एक स्कोप श्रृंखला मदद कर सकता है?

मैंने इसे पूर्ण बंद करने के लिए संपादित किया है। वैसे भी, बंद होने पर यहां बहुत चिंता नहीं है, इसे आंतरिक कार्यों के लिए माना जा सकता है, हालांकि, किसी भी तरह बंद होने के साथ समाधान हो सकता है।

धन्यवाद

उत्तर

3

आप जेएस में स्पष्ट रूप से स्कोप श्रृंखला तक नहीं पहुंच सकते हैं। आपकी समस्या पुराने छाया में से एक है, लेकिन जेएस में, यह वास्तव में रनटाइम पर है, यह आपके लिए उपलब्ध नहीं है।

यदि आप नफरत with ऑपरेटर का उपयोग वर्तमान क्षेत्र rejiggering के साथ कुछ चाल चल सकते हैं, लेकिन यह है कि (और साथ ही arguments के फोन करने वाले/कॉल प्राप्त करने वाला सामान) वास्तव में सिर्फ आप वस्तुओं और उनके गुणों के साथ कार्यों के लिए पहुँच दे। कहने का कोई तरीका नहीं है "मुझे यहां से एन-1 रनटाइम दायरे में xVar का अर्थ क्या है" दें।

0

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

कोई फ़ंक्शन बंद होने या स्थानीय चर के परीक्षण के लिए कोई आसान तरीका नहीं है। आपको कुछ प्रकार के प्रवाह नियंत्रण परीक्षण करना होगा और फिर असाइनमेंट का विश्लेषण करना होगा, जहां असाइनमेंट होते हैं, और जहां असाइनमेंट नहीं होते हैं। फिर आपको उन परिणामों की तुलना करनी चाहिए। आप किसी दिए गए इनपुट पर उस विश्लेषण को करने के लिए जावास्क्रिप्ट में एक टूल लिख सकते हैं और आपको आउटपुट के रूप में एक रिपोर्ट लिख सकते हैं।

+3

मुझे लगता है कि वह जानता है कि। सवाल यह है कि, "func1" के अंदर कोड से आप "बंद" में परिभाषित "xVar" (और "func1" में परिभाषित "xVar") को स्पष्ट रूप से कैसे संदर्भित करेंगे? – Pointy

+0

मैंने उत्तर दिया कि मेरे पहले पैराग्राफ में। –

1

एक आंतरिक दायरे में परिभाषित वेरिएबल्स बाहरी दायरे में परिवर्तनीय घोषणाओं को छुपाएं। "बेहतर और साफ समाधान" इस तरह परिवर्तनीय नामों का पुन: उपयोग नहीं करना है।

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