2013-08-21 1 views
10

मैंने हाल ही में HTML5 गेम बनाने के उद्देश्य से जावास्क्रिप्ट सीखना शुरू किया है, और मैं एक व्यवहार में आया हूं कि मुझे कठिन समय समझ रहा है ।समझ में नहीं आ रहा है कि इस जावास्क्रिप्ट फ़ंक्शन को एक तरफ क्यों कहा जा सकता है लेकिन अन्य

उदाहरण के तौर पर, मेरे पास एक निर्माता है जो नए स्प्राइट्स को क्रियाओं की एक श्रृंखला के साथ शुरू करता है जिसे उन्हें गेम अपडेट (जैसे एनिमेटिंग, मूविंग इत्यादि) के दौरान करना चाहिए। This JSFiddle एक बुनियादी कार्यान्वयन का प्रदर्शन करता है।

अनिवार्य रूप से, मैं क्यों यह काम नहीं करता है के रूप में उलझन में हूँ ...

Sprite = function() { 

    this.actions = [this.animate]; 
}; 

Sprite.prototype = { 

    animate: function() { /* animate the sprite */ }, 

    update: function() { 

     this.actions[0](); // doesn't do anything (?) 
    } 
}; 

... लेकिन इस

Sprite = function() { 

    this.actions = [this.animate]; 
    this.holder = 'whatever'; 
}; 

Sprite.prototype = { 

    animate: function() { /* animate the sprite */ }, 

    update: function() { 

     this.holder = this.actions[0]; 
     this.holder(); // executes animate function as desired 
    } 
}; 
मेरी अनुभवहीन आंखों के लिए

करता है, दोनों उदाहरण की तरह लग उन्हें एक ही चीज़ करना चाहिए। तो अगर मैं this.actions[0]() पर सीधे कॉल करता हूं तो कुछ भी क्यों नहीं होता है, लेकिन अगर मैं this.actions[0]this.holder पर निर्दिष्ट करता हूं और फिर this.holder() पर कॉल करता हूं, तो यह ठीक काम करता है?

+0

this.actions करने के लिए परिवर्तन [0]। हटाना ()। – Saturnix

उत्तर

4

जब कोई फ़ंक्शन कहा जाता है, तो फ़ंक्शन के अंदर this नामक स्थानीय चर को एक मान आवंटित किया जाएगा।

जब तक आप इसे बदलने के लिए कुछ किया है (जैसे new, bind(), call(), apply()), मूल्य वस्तु जिस पर यह कहा जाता है हो जाएगा। foo.bar()this === foobar फ़ंक्शन के अंदर।

this.actions[0]()thisactions संपत्ति

this.holder() के मूल्य के बराबर बनाता this लिए जो कुछ भी this का मूल्य बुला समारोह में है बराबर बना देता है।

आपका फ़ंक्शन this के मान पर निर्भर करता है जो भी करता है। इसे ठीक करने के

+0

तो पहला कोड 'यह होना चाहिए। [0] .apply (this); ' – jcubic

+0

क्या आप इस बारे में विस्तार से बता सकते हैं कि' this.holder()" यह "जो भी" इस "के मूल्य के बराबर है कॉलिंग फ़ंक्शन में? मैं यह समझने में सक्षम नहीं हूं कि यह क्यों विशेष रूप से अलग होना चाहिए जब यह 'hold.holder = this.actions [0] '। –

+1

'foo.bar.baz()' - 'baz' के अंदर, 'यह'' bar' के मान के समान है क्योंकि वह वस्तु है जिस पर 'baz()' कहा जाता था। 'this.holder()' '' 'पर' धारक 'कॉल करता है। 'this.actions [0]()' 'क्रियाओं 'पर' 0() 'कॉल'। – Quentin

3

दो तरीके:

Sprite = function() { 
    this.actions = [this.animate.bind(this)]; 
}; 

या:

update: function() { 
    this.actions[0].call(this); 
} 
+0

मैंने क्वांटिन के जवाब को स्वीकार किया क्योंकि मैं समाधान से अधिक स्पष्टीकरण की तलाश में था, लेकिन मुझे लगता है कि आपके द्वारा किए गए कार्यों को हाथ में पूरा करने के लिए प्रदान किए गए विकल्प बहुत उपयोगी हैं (मैं संभवतः अपने उद्देश्यों के लिए दूसरे का उपयोग कर रहा हूं)। – user2703034

+0

@ user2703034: हाँ, मुझे एहसास हुआ कि इसने आपके मूल प्रश्न का उत्तर नहीं दिया, लेकिन लगा कि यह उपयोगी होगा। – Eric

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