javascript Var me=this का मूल्य क्या है;




extjs (7)

असल में, हालांकि यह शायद प्रेरणा नहीं है, शैली के लिए ऐसा करने से कुछ समझ आता है। बहुत से स्टाइल सम्मेलन कुछ भूलना मुश्किल बनाते हैं, जैसे कि हमेशा एक और बयान के बावजूद {} को किसी अन्य ब्लॉक के आस-पास रखना। "इस" को पुन: असाइन करना उस शुरुआत में समान प्रभाव डालेगा जावास्क्रिप्ट प्रोग्रामर के पास उस समय का उच्च प्रतिशत "बस काम" बंद हो जाएगा।

https://code.i-harness.com

मुझे यह पैटर्न सभी ExtJS स्रोत कोड पर मिलता है।

method: function() {
  var me = this;
  ...
  me.someOtherMethod();
}

वे इसका उपयोग क्यों नहीं करते? क्या me हमेशा परिभाषित करने के लिए कुछ फायदा होता me (बाहर 2 अक्षर टाइप करने के बाहर)? मैं समझ सकता हूं कि क्या वे बंद होने के माध्यम से संदर्भ को बनाए रखने की कोशिश कर रहे हैं, लेकिन यह उन जगहों पर किया जाता है जहां कोई बंद नहीं होता है।

Ext.panel.Panel से एक उदाहरण:

disable: function(silent) {
    var me = this;

    if (me.rendered) {
        me.el.addCls(me.disabledCls);
        me.el.dom.disabled = true;
        me.onDisable();
    }

    me.disabled = true;

    if (silent !== true) {
        me.fireEvent('disable', me);
    }

    return me;
},

एक कारण यह है कि खनन के साथ, me बहुत छोटा हो सकता me


बंद करने में उपयोग के लिए एक संदर्भ बनाए रखने के बाहर मुझे उस पैटर्न का उपयोग करने के साथ किसी भी प्रोग्रामेटिक अंतर से अवगत नहीं है। शायद यह सिर्फ एक सम्मेलन है जो एक्स्टजेस का उपयोग कर रहा है।

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

उदाहरण के लिए 1000 'यह', 1 char = 1 बाइट मानते हुए, 4kb है। ऊपर की तकनीक का उपयोग संभवतः 2 या 3 केबी बंद कर सकते हैं।

अद्यतन: आगे बढ़ गया और एक छोटा प्रयोग किया ..

var test = {
  a : function() {
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  },
  b : function() {
      this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  },
  c : function() {
      this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
     this.x='';
      this.x='';
     this.x='';
     this.x='';
  }
}

में कमी

var test={a:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""},b:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""},c:function(){this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x="";this.x=""}}

जबकि

var test = {
  a : function() {
     var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  },
  b : function() {
      var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  },
  c : function() {
      var me=this;
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
     me.x='';
      me.x='';
     me.x='';
     me.x='';
  }
}

में कमी

var test={a:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""},b:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""},c:function(){var a=this;a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x="";a.x=""}}

जो लगभग 10% अधिक या कम वर्णों का अनुवाद करता है (बेशक यह इस बात पर निर्भर करता है कि आपके कोड के ब्लॉक स्कोप में यह 'दोहराया जाता है)।


यदि आपकी लाइब्रेरी ऐसी जगहों पर ऐसा कर रही है जहां कोई एम्बेडेड क्लोजर / कॉलबैक नहीं है जिसके पास इसका अपना मूल्य हो, तो यह सिर्फ एक "अभ्यास" या "शैली" या "सम्मेलन" है जिसे उन्होंने अपने तरीकों का पालन करने का फैसला किया। हमेशा ऐसा करने के लिए कोई प्रोग्रामिंग कारण नहीं है।

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

disable: function(silent) {

    if (this.rendered) {
        this.el.addCls(this.disabledCls);
        this.el.dom.disabled = true;
        this.onDisable();
    }

    this.disabled = true;

    if (silent !== true) {
        this.fireEvent('disable', this);
    }

    return this;
},

जब कॉलबैक या क्लोजर शामिल होता है, तो अक्सर ऐसा किया जाता है क्योंकि विधि के अंदर कॉलबैक का उपयोग किया जाता है जहां वे अभी भी इसका संदर्भ चाहते हैं, लेकिन उन कॉलबैक के पास इसका अपना मूल्य this ताकि असाइन किया जा सके:

var me = this;

या आमतौर पर मैंने देखा है कि दूसरे कोड में:

var self = this;

उस ऑब्जेक्ट तक पहुंच को बनाए रखने का एक तरीका है, यहां तक ​​कि कॉलबैक में इसका एक अलग मूल्य है।

यहां एक सामान्य उदाहरण दिया गया है:

document.getElementById("myButton").onclick = function () {
    var self = this;       // save reference to button object use later
    setTimeout(function() {
        // "this" is not set to the button inside this callback function (it's set to window)
        // but, we can access "self" here 
        self.style.display = "none";    // make button disappear 2 seconds after it was clicked
    }, 2000);
};

विशेष रूप से ExtJS ढांचे के लिए।

एक्स्टजेस के पास समस्याग्रस्त जावास्क्रिप्ट स्कोपिंग को संभालने के लिए स्वयं का तंत्र है, यह छोटा करने के लिए एकमात्र कारण है।

इस सेन्चा फोरम थ्रेड में इस विषय पर अधिक जानकारी है।


शैली के कारणों और खनन कारणों के अलावा, मैंने यह देखने के लिए प्रदर्शन को देखने का फैसला किया कि this या self कोई तेज़ था या नहीं। मैंने यह जेएसपीआरएफ परीक्षण बनाया है।

जैसा कि मैं सबसे अच्छा कह सकता हूं, मेरे द्वारा किए गए किसी भी आधुनिक ब्राउज़र में प्रदर्शन में कोई अंतर नहीं है या मैंने आईई 6 भी this बनाम उपयोग के माध्यम से self या me जैसे स्थानीय चर का उपयोग करके किया है। क्रोम self साथ इतनी तेज तेज है और अन्य कॉल के बहुत करीब हैं। मुझे लगता है कि हम किसी भी प्रदर्शन कारणों से इंकार कर सकते हैं। मैंने देखा परिणामों के एक स्क्रीन शॉट यहाँ दिया गया है:


Ext.panel.Panel उदाहरण के आधार पर आपने अभी जोड़ा है, जब तक कि जावास्क्रिप्ट चर की मेरी समझ काफी गलत न हो, यहां तक ​​कि असाइनमेंट न करने से कोड पर क्या असर नहीं पड़ेगा।

छोड़ दिया एकमात्र संभावना शैली है।

जबकि मैं इसे ओवेरिनियरिंग के रूप में स्थापित करता हूं, यह इस हद तक उपयोगी है कि यदि आप कभी भी उस कॉलबैक को जोड़ना चाहते हैं जिसके लिए इस संदर्भ में इसका उपयोग करना आवश्यक है, तो आपको यह सब me लिए बदलने के लिए वापस जाने की आवश्यकता नहीं होगी। रों। आखिरकार, टाइपिंग :s/ कठिन है।






extjs