2010-10-22 8 views
9

साथ जावास्क्रिप्ट पहुँच स्थानीय चर को देखते हुए निम्न JavaScript:इनर में एक ही नाम और बाहरी घेरा

var someFunction = function(id) { 
    //do some stuff 
    var modifyId = function(id) { 
    //do some stuff 
    outer.id = id; //is there any way to modify the id variable in the outer scope from here? 
    } 
} 

कैसे आप आंतरिक समारोह दायरे के भीतर से आईडी बाहरी समारोह दायरे में पारित संशोधित करूँ?

+0

सभी में एक जवाब: आप नहीं कर सकते हैं, आपको उनमें से एक का नाम बदलना होगा –

उत्तर

10

दुर्भाग्य से आप नहीं कर सकते हैं। नेस्टेड फ़ंक्शन id में पैरामीटर नामकरण करके, आपने बाहरी फ़ंक्शन में पैरामीटर को छायांकित किया है। जावास्क्रिप्ट में छायांकित नाम तक पहुंचने के लिए कोई सुविधा नहीं है। एकमात्र विकल्प एक चर के लिए एक अलग नाम चुनना है।

1

आप केवल एक चर का नाम क्यों नहीं बदल सकते?

2

नहीं, ऐसा नहीं है। किसी फ़ंक्शन के भीतर से, किसी भी स्पष्ट तरीके से संदर्भ के रूप में दायरे को संदर्भित करने के लिए कोई तरीका नहीं है (मोज़िला के कोड या ES5 को अजीब कुछ अजीब), और किसी भी प्रत्यक्ष तरीके से शब्दावली स्कोप श्रृंखला पर चढ़ने का कोई तरीका नहीं है।

हालांकि अच्छा सवाल है।

1
var someFunction = function(id) { 
    //do some stuff 
    var oid = id; 
    var modifyId = function(id) { 
    //do some stuff 
    // you can access the outer id via the oid variable 
    } 
} 

लेकिन, हाँ, आपको औपचारिक मानकों में से एक का नाम बदलना चाहिए।

+0

पहले मैंने सोचा कि यह काम करता है, लेकिन अगर आईडी एक आदिम है तो यह काम नहीं करेगा। आंतरिक कार्य से 'oid =" BLAH "सेट करना आईडी के मान को नहीं बदलेगा। यदि यह एक वस्तु थी, तो आईडी और ओड दोनों एक ही ऑब्जेक्ट को इंगित करेंगे, जो लगभग इच्छित प्रभाव है (आप अभी भी ऑब्जेक्ट आईडी को 'oid = {a: 1} ' –

+0

@Juan पर कॉल करके बदल सकते हैं हां। चूंकि आईडी एक स्ट्रिंग है (मुझे लगता है), इसका मतलब है कि इस मामले में मेरा काम-आसपास काफी बेकार है। इसलिए एकमात्र समाधान घोंसला वाले कार्यों में समान नामों के साथ औपचारिक मानकों से बचने के लिए बनी हुई है। –

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