2009-07-07 15 views
8

मैं एक जावास्क्रिप्ट नाम स्थान हो रहा है का कहना है किजावास्क्रिप्ट में किसी अन्य विधि के अंदर कॉलिंग विधि?

A={ 

    CA: function() { 
    this.B(); 
    }, 
    B: function() { 
    var test='test'; 
    var result='t1'; 

    C: function() { 
     this.test='test1'; 
     ..... 
     ..... 
     return 'test1';  
    } 

    result=this.C(); 
    return result; 
    } 
} 

अब जब मैं इस तरह के कोड को क्रियान्वित कर रहा हूँ यह है कि लेखन त्रुटि दे रहा है: this.C एक समारोह नहीं है। क्या कोई मुझे बता सकता है कि ऐसा क्यों है। मुझे पता है कि यह कुछ लेक्सिकल स्कोपिंग से संबंधित है लेकिन मैं इसे समझने में असमर्थ हूं।

+0

क्षमा करें, मैं एक नया उपयोगकर्ता हूँ और पहले प्रश्न पोस्ट, कैसे प्रश्न पोस्ट करने के पता नहीं है। मैं अब इसे ध्यान में रखूंगा। धन्यवाद। –

उत्तर

5

मुझे लगता है कि समस्या यह है कि जब this.C() समारोह B से जाना जाता अंदर निष्पादित किया जाता है, this उद्देश्य यह है कि B होता है, कि है, वस्तु A को संदर्भित करता है।

समस्या है, C वस्तु A पर मौजूद नहीं है, क्योंकि यह B भीतर परिभाषित किया है (यह B()A के संदर्भ में कहा जाता है मान लिया गया है)। यदि आप स्थानीय फ़ंक्शन C() को B के भीतर कॉल करना चाहते हैं, तो बस C() का उपयोग करें।

संपादित करें: इसके अलावा, मुझे यकीन है कि तुम क्या पोस्ट किया है मान्य JavaScript है नहीं कर रहा हूँ। विशेष रूप से, B इस तरह से परिभाषित किया जाना चाहिए, क्योंकि आप किसी फ़ंक्शन के भीतर ऑब्जेक्ट: प्रॉपर्टी सिंटैक्स का उपयोग नहीं कर सकते हैं।

B: function() 
{ 
    var test='test'; 
    var result='t1'; 

    var C = function() 
    { 
    this.test='test1'; 
    return 'test1';  
    } 

result=C(); 
return result; 
} 
+0

मुझे लगता है कि आप सही हैं और मैंने यह भी करने के लिए अपने सिर को टक्कर देने के बाद अंततः (फ़ंक्शन बनाया और इसे सीधे बाहरी फ़ंक्शन से भी कहा)। सी काम कर रहा है। –

4

मुझे वास्तव में हैरान है कि आपका कोड आपको 'सी:' लाइन पर त्रुटि नहीं देता है।

वैसे भी, एक समारोह को परिभाषित करने के लिए अपने वाक्य रचना सही नहीं है। इसे var कीवर्ड का उपयोग करके परिभाषित करें। साथ ही, ध्यान दें कि मैंने 'बंद' बनाया है ताकि फ़ंक्शन सी 'इस' तक पहुंच सके। नीचे दिए गए कोड देखें: आप 'इस' वस्तु के लिए सी प्रदान करना चाहते हैं

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    var C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      } 

    result=C(); 
    return result; 
    } 
} 

, आप भी कर सकते हैं:

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    this.C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      }; 

    result= this.C(); 
    return result; 
    } 
} 
+0

आप 'इस' का उपयोग नहीं कर पाएंगे क्योंकि 'यह' एक कीवर्ड है और आपको बंद करने की आवश्यकता है। इसके अलावा, क्योंकि मैं स्थानीय चर के रूप में 'स्वयं' को परिभाषित कर रहा हूं, यह वैश्विक वस्तु को प्रभावित नहीं करेगा। – SolutionYogi

+0

हाँ क्षमा करें, मुझे मेरी नींद आ गई, और इसलिए मेरी टिप्पणी हटा दी :-(लेकिन हाँ अब मैं आपके उत्तर से सहमत हूं। मेरे साथ भी डालने के लिए +1 :-) –

21

जब आप इस का उपयोग कुछ भी पहचान करने के लिए सावधान रहना होगा जावास्क्रिप्ट में क्योंकि प्रत्येक बार जब आप "यह" परिवर्तन बदलते हैं।

उसके अपने चर के लिए 'इस' संदर्भ नियत यह चारों ओर पाने में मदद करता।

var a = new function() { 
    var self = this; 

    self.method = function() { alert('hiya'); }; 

    var b = function() { 
     this.method(); // this isn't 'a' anymore? 
     self.method(); // but 'self' is still referring to 'a' 
    }; 

}; 
+1

var self = this; बस मैं क्या देख रहा था! धन्यवाद! –

+0

यह वही है जो मुझे चाहिए, बहुत बहुत धन्यवाद। –

0

किसी अन्य विधि से विधियों को कॉल करने के लिए समाधान। (अनिवार्य रूप से सूचक "इस" एक चर और नए चर इस के स्थान पर इस्तेमाल करने के लिए आवंटित किया जाना चाहिए।)

function myfunction(){ 
    var me = this; 

    me.method1 = function(msg){ alert(msg); } 

    me.method2 = function(){ 
     me.method1("method1 called from method2"); 
    } 
} 

var f as new myfunction(); 
f.method2(); 

यह उदाहरण दिखाता है कि एक अन्य विधि के भीतर या से से एक विधि कॉल के बाहर एक उदाहरण का उपयोग कर सकते हैं समारोह का

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