जब आप किसी विधि को निष्पादित करते हैं (यानी किसी ऑब्जेक्ट को सौंपा गया कार्य), तो इसके अंदर आप thisइस ऑब्जेक्ट को संदर्भित करने के लिए चर का उपयोग कर सकते हैं , उदाहरण के लिए:
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
obj.someMethod(); // logs true
यदि आप एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट को असाइन करते हैं, तो इसका thisवेरिएबल उदाहरण के लिए नई ऑब्जेक्ट को संदर्भित करता है:
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
var anotherObj = {
someProperty: false,
someMethod: obj.someMethod
};
anotherObj.someMethod(); // logs false
जब आप किसी अन्य ऑब्जेक्ट requestAnimationFrameकी विधि असाइन करते हैं तो वही बात होती है window। इस तरह के मूल कार्य, अन्य संदर्भ में इसे निष्पादित करने से निर्माण-सुरक्षा है।
एक Function.prototype.call()फ़ंक्शन है, जो आपको किसी अन्य संदर्भ में फ़ंक्शन को कॉल करने की अनुमति देता है। आपको बस इस विधि के पहले पैरामीटर के रूप में इसे (जो वस्तु संदर्भ के रूप में इस्तेमाल किया जाएगा) पास करना होगा। उदाहरण के लिए alert.call({})देता है TypeError: Illegal invocation। हालांकि, alert.call(window)ठीक काम करता है, क्योंकि अब alertअपने मूल दायरे में निष्पादित होता है।
यदि आप .call()अपनी वस्तु का उपयोग इस तरह करते हैं:
support.animationFrame.call(window, function() {});
यह ठीक काम करता है, क्योंकि आपकी वस्तु requestAnimationFrameके windowबजाय दायरे में निष्पादित होता है ।
हालाँकि, .call()हर बार जब आप इस पद्धति को कॉल करना चाहते हैं, तो यह बहुत ही सुंदर समाधान नहीं है। इसके बजाय, आप उपयोग कर सकते हैं Function.prototype.bind()। इसका समान प्रभाव पड़ता है .call(), लेकिन फ़ंक्शन को कॉल करने के बजाय, यह एक नया फ़ंक्शन बनाता है जिसे हमेशा निर्दिष्ट संदर्भ में कहा जाएगा। उदाहरण के लिए:
window.someProperty = true;
var obj = {
someProperty: false,
someMethod: function() {
console.log(this.someProperty);
}
};
var someMethodInWindowContext = obj.someMethod.bind(window);
someMethodInWindowContext(); // logs true
केवल नकारात्मक पक्ष Function.prototype.bind()यह है कि यह ECMAScript 5 का एक हिस्सा है, जो IE <= 8 में समर्थित नहीं है । सौभाग्य से, एमडीएन पर एक पॉलीफ़िल है ।
जैसा कि आप शायद पहले से ही पता लगा चुके हैं, आप .bind()हमेशा के requestAnimationFrameसंदर्भ में निष्पादित करने के लिए उपयोग कर सकते हैं window। आपका कोड इस तरह दिख सकता है:
var support = {
animationFrame: (window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame).bind(window)
};
तो आप बस का उपयोग कर सकते हैं support.animationFrame(function() {});।