मुझे जावास्क्रिप्ट चर के लिए स्कोपिंग के एक विशिष्ट मामले के आसपास अपना सिर नहीं लग रहा है। मुझे मिले अन्य उदाहरणों और प्रश्नों से अलग, मुझे नेस्टेड कार्यों के लिए स्कोपिंग में रूचि है।जावास्क्रिप्ट स्थानीय स्कोपिंग: var बनाम यह
मैंने this JSFiddle पर एक उदाहरण स्थापित किया है।
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + self.a); // self.a = undefined
logMessage("self.b = " + self.b); // self.b = 2
}
}
अब, मैं समझता हूँ कि a
के लिए एक संदर्भ सीधे काम करता है: प्रासंगिकता का पीछा कर रहा है। मैं यह भी समझता हूं कि संदेश 3 और 4 (this.a
और this.b
) विफल हो जाएंगे क्योंकि this
आंतरिक फ़ंक्शन को संदर्भित करता है। मैं यह भी समझता हूं कि लाइन 6 काम करता है क्योंकि मैं मूल वस्तु के संदर्भ को सहेजता हूं।
क्या मुझे समझ नहीं आता है:
- क्यों गए संदेशों 1 और 2 के लिए एक जैसे काम नहीं कर रहे हैं?
- संदेश 5 और 6 समान रूप से क्यों काम नहीं कर रहे हैं?
पर खेल सकते हैं क्यों वे एक जैसे काम करेगा? ऐसा लगता है कि आप जावा या किसी अन्य भाषा के साथ समानता कर रहे हैं जहां 'यह' नामस्थान अंतर्निहित है, जो जेएस के लिए मामला नहीं है। –
@ FabrícioMatté मैं यह बेहोश हो सकता है (पन इरादा)। मैं समझने में असफल रहा कि क्या स्कोपिंग को चर/सदस्यों को स्वचालित रूप से आंतरिक सदस्यों के सामने उजागर करना चाहिए। ऐसा लगता है कि यह मामला नहीं है, क्योंकि यह संगत नहीं है। – Alpha
@Alpha आप चर तुलना कर रहे हैं ('वर एक = 5;') कि चर लेकिन वस्तुओं ('के गुणों this.b = 10 नहीं कर रहे हैं चीजों के साथ;' संपत्ति 'वस्तु की b' कि' this' संदर्भित करता है सेट '10' तक)। ये चीजें समान नहीं हैं और इसलिए समान व्यवहार नहीं करती हैं। – Niko