2010-08-28 11 views
11

मुझे किसी ऑब्जेक्ट विधि के भीतर जावास्क्रिप्ट इनलाइन फ़ंक्शन के भीतर "यह" संदर्भित करने में कठिनाई हो रही है।किसी ऑब्जेक्ट के इनलाइन फ़ंक्शन के भीतर से इसे एक्सेस करना

var testObject = { 
    oThis : this, 
    testVariable : "somestring", 
    init : function(){ 

     console.log(this.testVariable); // outputs testVariable as expected 

     this.testObject.submit(function(){ 

      var anotherThis = this; 
      console.log(this.testVariable) // undefined 
      console.log(oThis.testVariable) // undefined 
      console.log(testObject.testVariable) // outputs testVariable 
      console.log(anotherThis.testVariable) // undefined 

    } 

} 

मैं सबमिट समारोह में से this.testVariable तक कैसे पहुंचूं? मैं भी jQuery का उपयोग कर रहा हूं, अगर इससे कोई फर्क पड़ता है।

मुझे आश्चर्य है कि अगर यह सबसे अच्छा तरीका है - और शायद मैं एक अलग समारोह के रूप में प्रस्तुत करना चाहिए था, और उसके बाद का संदर्भ है कि इनलाइन, जैसे:

init : function(){ 

    this.testObject.submit = this.submitForm; 

}, 
submitForm : function(){ 
    // do validation here 
    console.log(this.testVariable) // outputs testvariable 

    . 
    . 
    . 

    return valid; 
} 

लेकिन यह काम करने के लिए या तो नहीं मालूम था - और मुझे लगता है कि मैं अभी सबमिट करने के लिए अपने init विधि में सबमिट फ़ंक्शन इनलाइन रखना चाहता हूं।

+0

संभावित डुप्लिकेट [इस बंदरगाह को 'इस' कीवर्ड तक क्यों नहीं पहुंचता है? - jQuery] (http://stackoverflow.com/questions/3323189/why-doesnt-this-closure-have-access-to-the-this-keyword-jquery) –

उत्तर

30

this असाइन करने का एक आम तरीका है जो आप स्थानीय चर चाहते हैं।

init: function() { 
    var _this = this; 
    this.testObject.submit(function() { 
     console.log(_this.testVariable); // outputs testVariable 
    }); 
} 
+1

ओह "यह" का असाइनमेंट init के अंदर है समारोह - बेशक ... goddamit! यही वह है जो मैं करने की कोशिश कर रहा था, लेकिन इसके बजाय अनाम कार्य के भीतर इसे असाइन कर रहा था ... आपकी मदद के लिए धन्यवाद! – Matt

+0

अब मुझे लगता है कि मैं दुनिया में सबसे बेवकूफ व्यक्ति हूं - / – kurumkan

0

"इस" चर बाध्य एक समारोह — किसी भी समारोह है, जहां यह — परिभाषित किया गया था की परवाह किए बिना है गतिशील रूप से जब बुलाया है।

यह देखने के बिना कि "सबमिट" फ़ंक्शन क्या करना है, या जहां इसका उपयोग किया जाना चाहिए, यह कहना मुश्किल है कि इसे कैसे बदला जाए। एक बात तुम कर सकते हो "सबमिट करें" अपने "init" समारोह में परिभाषित करने के लिए है: के रूप में "init"

init: function() { 
    // whatever 
    var instance = this; 
    instance.submitForm = function() { 
    console.log(instance.testVariable); 
    // ... 
    }; 
} 

जब तक साथ "इस" अपने वस्तुओं में से एक का एक उदाहरण के लिए सेट शुरू में कहा जाता है, तो आप चाहिए अच्छा बनो।

0

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

var testInstance = new testObject(); 

की तरह तो फिर तुम का उपयोग करके oThis पहुंच सकता है:

testInstance.oThis; 

लेकिन वह निरर्थक हो

मैं इस मैट की तरह कुछ की कोशिश करेंगे होगा:

init: function(){ 

var self = this; // this allows you to access the parent object from different contexts 

this.testObject.submit(function(){ 

    console.log(self.testVariable); 

} 
5

आप कर सकते थे ES6 तीर फ़ंक्शंस का उपयोग करके यह भी करें:

init: function(){ 
    this.testObject.submit(() => { 
     console.log(this.testVariable); 
    } 
} 

तीर कार्यों पर कब्जा संलग्न संदर्भ से this मूल्य, एक नया वेरिएबल को this आवंटित करने के लिए, या बाध्य कार्यों का उपयोग करने की आवश्यकता से परहेज।

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