2012-05-14 16 views
12

मैं से mongoose'यह' को 'स्वयं' क्यों असाइन करें और 'self.method() `चलाएं?

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    self.doQueue(); 
}; 

स्रोत पढ़ रहा हूँ मुझे समझ नहीं आता क्यों लेखक self को this प्रदान करती है और self.doQueue() चलाता है। क्यों न केवल दौड़ें:

this.buffer = false; 
this.doQueue(); 

मैं जावास्क्रिप्ट के लिए नया हूं, मदद के लिए धन्यवाद।

उत्तर

14

आप सही हैं, इस उदाहरण में वे आसानी से this का उपयोग कर सकते थे।

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

-1

स्वयं 'इस' की एक प्रति है, लेकिन यह हमेशा सही वस्तु का संदर्भ देता है, और 'यह' नहीं हो सकता है।

+0

यह जब तक आप एक नया कार्य गुंजाइश पैदा करेगा। – ThiefMaster

+2

यह एक सुंदर * हाथ लहराता * उत्तर है जिसमें कोई उदाहरण नहीं है और वास्तविक * स्पष्टीकरण नहीं है। – Matt

2

एकमात्र कारण यह है कि आप आमतौर पर ऐसा करेंगे यदि doQueue() पर कॉल एक ब्लॉक के अंदर है जो this के मान को अन्य फ़ंक्शन के रूप में बदल देगा।

इस मामले में हालांकि यह किसी भी उद्देश्य की सेवा नहीं करता है और शायद पुराने कोड का अवशेष था जो वापस नहीं बदला गया था।

2

अधिकतर डेवलपर स्थिरता चाहता था, लेकिन ऐसा करने में असफल रहा।

नहीं तो आप अन्य कार्यों में कुछ कार्यों में this, self अन्य कार्यों में और a mix of both का उपयोग कर होता जा है, जहां आप ऑब्जेक्ट का उपयोग पर निर्भर करता है और यदि आप नेस्टेड कार्य/कॉलबैक का उपयोग करें।

always assigning this to self तक और फिर बाद का उपयोग कर आप प्रत्येक कार्य के बहुत शुरुआत में एक अतिरिक्त काम है, लेकिन आप हमेशा उपयोग self वस्तु का उपयोग करने की।

हालांकि, आपके द्वारा पोस्ट किए गए कोड में डेवलपर ने क्या किया है, यह अधिक समझ में नहीं आता है। उसे या तो मिश्रण के बजाय self या this दोनों बार उपयोग करना चाहिए जो आवश्यक नहीं है।

+0

... लेकिन ऊपर की रेखा में वह 'this.buffer = false;' कर रहा है। – Matt

2

बस और अधिक स्पष्टता देने के लिए करने के लिए @richard पहले कहा,

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    this.onclick = function(){ 
    //do some other operations here 
    //if you refer `this` here then, `this` will refer to present function not the above. so to make sure it is referring to exact object people pass this to `me` or `self` 
    self.doQueue(); 
    } 
}; 
+1

आप पोस्ट को अव्यवस्थित करने के बजाय अपने उत्तर में एक संपादन का प्रस्ताव दे सकते हैं, धन्यवाद। –