क्या हो रहा है की एक व्याख्या। प्वाइंट का जवाब अच्छा है लेकिन मैं इसे अधिक सामान्य रूप से समझाऊंगा। this
पर एक बहुत अच्छा शोध here
एक ईवेंट हैंडलर केवल कॉलबैक है। आप इसे एक समारोह और सुनने के लिए एक घटना पास करते हैं। अंततः यह सब उस काम को कॉल करेगा।
Animation.init केवल उस फ़ंक्शन के लिए एक गेटर है। इस तरह यह के बारे में सोचो:
var callback = Animation.init
animBtn.addEventListener('click', callback, false);
...
// internal browser event handler
handler() {
// internal handler does stuff
...
// Oh click event happened. Let's call that callback
callback();
}
तो आपके द्वारा किए गए जावास्क्रिप्ट this === window
में
var callback = function(){
this.doTheMove(); // I'm calling the function here, but it gives an error.
}
में पारित हो जाता है डिफ़ॉल्ट रूप से। यह वैश्विक वस्तु को संदर्भित करेगा यदि यह किसी चीज़ पर सेट नहीं है। शुद्ध प्रभाव यह है कि window.doTheMove
कहा जाता है। और वह कार्य मौजूद नहीं है।
इस मामले में callback
के बाद से actaully एक घटना से पुकारा जाता है डोम उद्देश्य यह है कि अपने फोन node.doTheMove
जो अभी भी अस्तित्व में नहीं है तो ईवेंट को ट्रिगर करने में this
वस्तु अंक हैंडलर।
आप जो करना चाहते थे उसे एनीमेशन के संदर्भ में लपेटना है।
var callback = function() {
Animation.init();
}
यह एक समारोह निष्पादन है और यह Animation
पर init
निष्पादित करता है। जब आप इसे किसी ऑब्जेक्ट पर निष्पादित करते हैं तो आंतरिक रूप से this === Animation
जैसा कि आप उम्मीद करेंगे।
समेट करने के लिए। यहां मुद्दा यह है कि Animation.init
केवल एक फ़ंक्शन का संदर्भ है। इसके बारे में कोई जानकारी नहीं है जैसे पॉइंटी ने उल्लेख किया है।
आपका उत्तर अधिकतर सही है (अंतिम परिणाम में बिल्कुल सही)। केवल गलती है * "शुद्ध प्रभाव वह खिड़की है .doTheMove कहा जाता है।" *। चूंकि 'init'' addEventListener' को पास किया गया है, इसे वास्तव में 'एनिमबटन' तत्व के संदर्भ से बुलाया जा रहा है, इसलिए 'this.doTheMove()' प्रभावी रूप से 'animBtn.doTheMove()' है। फिर, अंतिम परिणाम वही है। बस एक मामूली जानकारी। – user113716
@patrickdw धन्यवाद मुझे यकीन नहीं था कि यह 'डीओएम ऑब्जेक्ट या विंडो ऑब्जेक्ट के रूप में पारित किया गया था या नहीं। मैं पुष्टि करने के लिए परीक्षण करने के लिए परेशान नहीं किया था। मुझे बहुत उम्मीद थी। – Raynos
+1 और निष्पक्ष होने के लिए, 'यह' का आपका मूल्यांकन सही होगा यदि यह माइक्रोसॉफ्ट के' अटैचमेंट 'का उपयोग किया जा रहा था क्योंकि यह (कुछ कारणों से) हैंडलर के संदर्भ को सेट नहीं करता है। – user113716