2012-11-13 18 views
37

मैं कई स्रोत कोड में देखा था:जावास्क्रिप्ट "मुझे" = "यह", क्यों?

var me = this; 

Ext-जे एस 4 (जे एस ढांचे) में विशेष रूप से। ऐसी चीज क्यों कर रही है? क्या कोई अन्य कारण है या आप सिर्फ एक चर के लिए "यह" के बजाय "मुझे" कहलाते हैं?

धन्यवाद।

+7

इसका उपयोग क्लोजर या कॉलबैक में किया जाता है, जब अज्ञात फ़ंक्शन के अंदर 'यह' परिवर्तन का संदर्भ होता है। अधिक बार, आप देखेंगे 'var = = –

+0

ओह, मैं समझता हूं। इसे फ़ंक्शन के अंदर बदला जा सकता है ... अच्छा धन्यवाद। :) –

उत्तर

49

आमतौर पर आप this पर एक दायरे के अंदर संदर्भ रख सकते हैं जिसमें this कुछ और संदर्भित करता है (उदाहरण के लिए कॉलबैक फ़ंक्शन की तरह)। में

var MyClass = function (elem) { 
    this.elem = elem; 
    this.name = "James"; 
    elem.addEventListener("click", function() { 
     alert(this.name); //oops 
    }, false); 
}; 

अब इस उदाहरण पर विचार करें,:

इस उदाहरण है, जिसमें क्लिक ईवेंट हैंडलर समारोह आप क्या उम्मीद कर सकते हैं करने के लिए एक अलग संदर्भ है पर विचार करें (thisMyClass का एक उदाहरण का उल्लेख नहीं करता) जो हम निर्माता समारोह अंदर this का मूल्य के लिए एक संदर्भ की दुकान है, और का उपयोग करें कि कॉलबैक फ़ंक्शन के अंदर:

var MyClass = function (elem) { 
    var me = this; 
    this.elem = elem; 
    this.name = "James"; 
    elem.addEventListener("click", function() { 
     alert(me.name); //works! 
    }, false); 
}; 

कॉलबैक फ़ंक्शन एक चर था उल्लेख कर सकते हैं उस समारोह के बाद भी बाहरी समारोह में घोषित किया गया है (MyClass कन्स्ट्रक्टर रिटर्न जैसे ही इसे addEventListener निष्पादित किया गया है)। यह बंद का प्रदर्शन है।

+0

मैं समझता हूं और आपको धन्यवाद देता हूं। :) –

+0

@ user1509885 - आपका स्वागत है, खुशी है कि मैं मदद कर सकता हूं :) –

+0

आपने दूसरों के मुकाबले अपने उत्तर में अधिक जानकारी दी है, इसलिए यह उत्तर स्वीकार्य के रूप में चिह्नित किया जाएगा। बस 4 और मिनट ... दाहा ... –

1

मूल रूप से यह जावास्क्रिप्ट में बंद का उपयोग करता है। Read this about closure.

इसका उपयोग this के विशेष उदाहरण को this पर एक अलग अर्थ रखने के लिए किया जाता है।

+0

समझें। धन्यवाद। :) –

5

हालांकि निश्चित रूप से बंद करने के लिए यह अधिक स्पष्ट कारण है, मैं बस एक और कारण जोड़ना चाहता हूं कि जावास्क्रिप्ट फ़ाइल के minified संस्करण के आकार को कम किया जा सके।

this किसी कीवर्ड के रूप में फ़ाइल को छोटा करने की प्रक्रिया में बदला नहीं जा सकता है, जबकि स्थानीय चर कर सकते हैं। दूसरे शब्दों में, जब भी आप इसका उपयोग करेंगे (4 अक्षर), इसके बजाय 1 वर्ण स्थानीय चर का उपयोग किया जा सकता है।

निम्न में से example function पर विचार करें ExtJS के Ext.data.Store:

filterBy: function(fn, scope) { 
    var me = this; 

    me.snapshot = me.snapshot || me.data.clone(); 
    me.data = me.queryBy(fn, scope || me); 
    me.fireEvent('datachanged', me); 
    me.fireEvent('refresh', me); 
} 

और उसके minified संस्करण (कोई बंद यहाँ शामिल है ध्यान दें):

filterBy:function(b,a){var c=this;c.snapshot=c.snapshot||c.data.clone();c.data=c.queryBy(b,a||c);c.fireEvent("datachanged",c);c.fireEvent("refresh",c)} 

(151 पात्रों/बाइट्स)

अब, इसकी तुलना करें न्यूनतम किया संस्करण के लिए अगर हम एक स्थानीय चर के लिए this आवंटित नहीं किया:

filterBy:function(b,a){this.snapshot=this.snapshot||this.data.clone();this.data=this.queryBy(b,a||this);this.fireEvent("datachanged",this);this.fireEvent("refresh",this)} 

(170 पात्रों/बाइट्स)

आप एक स्थानीय चर के साथ संस्करण देख सकते हैं केवल के आकार के 88% लेता है फ़ंक्शन जो प्रत्येक बार this का उपयोग करता है।

विशेष रूप से बड़ी पुस्तकालयों में यह फ़ाइल आकार को थोड़ा कम कर सकता है।

+0

[+1] ExtJS बहुत सारे कार्यों में 'var me = this' का उपयोग करता है जबकि बंद होने की शायद ही आवश्यकता होती है। ऐसा लगता है कि 'i' का उपयोग तब किया जाता है जब एक से अधिक' यह 'की आवश्यकता होती है। – Skrol29

1

me=this सेट करने से आपको एक आंतरिक दायरे में एक बाहरी दायरे से this चर का उपयोग करने के लिए अनुमति देता है।

var Outer= function() { 
     var me = this; 
     me.x = "outerx"; 
     me.inner = { 
      x: "innerx", 
      displayValues: function() { 
       console.log(me.x); //outerx 
       console.log(this.x); //innerx 
      } 
     }; 
    }; 

    new Outer().inner.displayValues(); 
संबंधित मुद्दे