दिलचस्प पोस्ट
सूचि धागे-सुरक्षित हैं क्या यह ठीक है अगर मैं जावा में घुंघराले ब्रेसिज़ को छोड़ूं? कॉर्पोरेट प्रॉक्सी। पीएसी के पीछे एनपीएम का उपयोग करना PHP में स्ट्रिंग की अधिकतम लंबाई क्या है? आईओएस पर आईएसओ 8601 की तारीख कैसे प्राप्त करूं? व्यू बिल्ड समय क्या है? क्लाइंट-साइड जावास्क्रिप्ट में बेस 64 एन्कोडिंग और डीकोडिंग एंड्रॉइड संसाधनों / मूल्यों में फ्लोटिंग पॉइंट वैल्यू जोड़ें मैं सी # का उपयोग कर एक यूआरएल पैरामीटर को कैसे डीकोड कर सकता हूं? पायथन में इंडेक्स का उपयोग करके पीछे की ओर लूप? कास्टिंग सूची <T> – सहानुभूति / भ्रष्टाचार समस्या एंड्रॉइड लेखन लॉग फाइल करने के लिए पाठ HTML इनपुट टैग समस्या को बंद करना 'बटन' के 'क्लिक' ईवेंट के सभी ईवेंट हैंडलर्स को कैसे निकालना संभव होगा? कस्टम यूनाइविगेशनबार पृष्ठभूमि

टाइम-टाइम कॉलबैक सेट करने के लिए सही "यह" संदर्भ पास करें?

मैं setTimeout में संदर्भ कैसे पास कर सकता हूं? मैं इस this.tip.destroy() को कॉल करना चाहता हूं यदि यह this.options.destroyOnHide 1000 ms के बाद मैं उसे कैसे कर सकता हूँ?

 if (this.options.destroyOnHide) { setTimeout(function() { this.tip.destroy() }, 1000); } 

जब मैं ऊपर की कोशिश करता हूँ, this खिड़की को संदर्भित करता है।

वेब के समाधान से एकत्रित समाधान "टाइम-टाइम कॉलबैक सेट करने के लिए सही "यह" संदर्भ पास करें?"

आपको संदर्भ के संदर्भ को सहेजने की आवश्यकता है जहां setTimeout फ़ंक्शन कॉल किया जाता है, क्योंकि setTimeout फ़ंक्शन को वैश्विक ऑब्जेक्ट की ओर इंगित करता है:

 var that = this; if (this.options.destroyOnHide) { setTimeout(function(){that.tip.destroy()}, 1000); } 

आप आसानी से साबित कर सकते हैं कि setTimeout this पर वैश्विक ऑब्जेक्ट को सेट this :

 (function () { alert(this); // alerts hello setTimeout(function(){ alert(this == window); // true }, 1000); }).call("hello"); 

यह भी देखें:

  • setTimeout – 'यह' समस्या

फ़ंक्शन आवरण @ सीएमएस के साथ तैयार शॉर्टकट (वाक्यविन्यास चीनी) के साथ उत्तर दिया गया है। (यह मानते हुए कि आपके इच्छित संदर्भ this.tip है this.tip ।)


ECMAScript 5 ( वर्तमान ब्राउज़र , नोड। जेएस) और प्रोटोटाइप.जे.एस.

यदि आप ईसीएमए -262, 5 वें संस्करण (ईसीएमएस्क्रिप्ट 5) या नोड.जेएस के साथ संगत ब्राउज़र को लक्षित करते हैं, तो आप फंक्शन.प्रोटोटाइप.बिंड का उपयोग कर सकते हैं। आंशिक फ़ंक्शंस बनाने के लिए आप वैकल्पिक रूप से किसी भी फ़ंक्शन तर्क को पारित कर सकते हैं।

 fun.bind(thisArg[, arg1[, arg2[, ...]]]) 

फिर, आपके मामले में, यह प्रयास करें:

 if (this.options.destroyOnHide) { setTimeout(this.tip.destroy.bind(this.tip), 1000); } 

समान कार्यक्षमता भी प्रोटोटाइप (किसी भी अन्य पुस्तकालयों में?) में लागू की गई है

Function.prototype.bind को इस तरह कार्यान्वित किया जा सकता है यदि आप कस्टम पीछे की ओर संगतता चाहते हैं (लेकिन नोटों को देखें)।


ECMAScript 2015 ( कुछ ब्राउज़र , Node.js 5.0.0+)

अत्याधुनिक विकास (2015) के लिए आप वसा तीर फ़ंक्शंस का उपयोग कर सकते हैं, जो ECMAScript 2015 (सद्भाव / ES6 / ES2015) विनिर्देशन ( उदाहरण ) का हिस्सा हैं।

फ़ंक्शन अभिव्यक्ति की तुलना में एक तीर फ़ंक्शन अभिव्यक्ति (जिसे वसा तीर फ़ंक्शन के रूप में भी जाना जाता है) की एक छोटी सिंटैक्स है और this मान को बोलने से बाध्य किया जाता है […]।

 (param1, param2, ...rest) => { statements } 

आपके मामले में, यह प्रयास करें:

 if (this.options.destroyOnHide) { setTimeout(() => { this.tip.destroy(); }, 1000); } 

jQuery

यदि आप पहले से ही jQuery 1.4+ का उपयोग कर रहे हैं, तो फ़ंक्शन के this संदर्भ को स्पष्ट रूप से सेट करने के लिए एक तैयार किया गया फ़ंक्शन है।

jQuery.proxy () : एक फ़ंक्शन लेता है और एक नया वाला देता है जो हमेशा एक विशेष संदर्भ रखता है

 $.proxy(function, context[, additionalArguments]) 

आपके मामले में, यह प्रयास करें:

 if (this.options.destroyOnHide) { setTimeout($.proxy(this.tip.destroy, this.tip), 1000); } 

अंडरस्कोर.जेएस , रद्दीश

यह अंडरस्कोर.जेएस में उपलब्ध है, साथ ही साथ लॉन्श, _.bind(...) 1 , 2 के रूप में

बाँध किसी फ़ंक्शन को किसी ऑब्जेक्ट में बांधा , जिसका अर्थ है कि जब भी फ़ंक्शन कहा जाता है, तो इसका मूल्य ऑब्जेक्ट होगा वैकल्पिक रूप से, उन्हें पूर्व-भरने के लिए फ़ंक्शन को बाध्य तर्क, जिसे आंशिक एप्लिकेशन भी कहा जाता है।

 _.bind(function, object, [*arguments]) 

आपके मामले में, यह प्रयास करें:

 if (this.options.destroyOnHide) { setTimeout(_.bind(this.tip.destroy, this.tip), 1000); } 

बाइंड करें jquery underscore.js बिगमास्क्रिप्ट -5 प्रोटोटाइपजेस नोड.जेएस

इंटरनेट एक्सप्लोरर के अलावा ब्राउज़र्स में, आप विलंब के बाद समारोह में पैरामीटर पारित कर सकते हैं:

 var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); 

तो, आप यह कर सकते हैं:

 var timeoutID = window.setTimeout(function (self) { console.log(self); }, 500, this); 

यह एक स्कोप लुकअप (समयबाह्य / अंतराल अभिव्यक्ति के बाहर एक चर में कैशिंग) की तुलना में प्रदर्शन के मामले में बेहतर है, और फिर एक बंद ( $.proxy या Function.prototype.bind का उपयोग कर) बना रहा है।

इसे वेबरेबिलिंग से आईईएस में काम करने के लिए कोड:

 /*@cc_on (function (modifierFn) { // you have to invoke it as `window`'s property so, `window.setTimeout` window.setTimeout = modifierFn(window.setTimeout); window.setInterval = modifierFn(window.setInterval); })(function (originalTimerFn) { return function (callback, timeout){ var args = [].slice.call(arguments, 2); return originalTimerFn(function () { callback.apply(this, args) }, timeout); } }); @*/ 

यदि आप underscore का उपयोग कर रहे हैं, तो आप bind उपयोग कर सकते bind

उदाहरण के लिए

 if (this.options.destroyOnHide) { setTimeout(_.bind(this.tip.destroy, this), 1000); } 

नोट: यह IE में काम नहीं करेगा

 var ob = { p: "ob.p" } var p = "window.p"; setTimeout(function(){ console.log(this.p); // will print "window.p" },1000); setTimeout(function(){ console.log(this.p); // will print "ob.p" }.bind(ob),1000);