2013-07-25 2 views
5

win अंक window पर अंक। NS इस पोस्ट के लिए एक अस्थायी नेमस्पेस है। मैंने सोचा कि अगर मैं setTimeout के लिए उपयोग करना चाहता था, मैं सिर्फ इस तरह के रूप समारोह संदर्भ पर कॉपी कर सकते हैं:फ़ंक्शन संदर्भों को ठीक से निष्पादित कैसे किया जा सकता है (1)?

NS.setTimeout = win.setTimeout; 

हालांकि, निष्पादन एक त्रुटि फेंक होगा

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype object @ ... 

इस त्रुटि को ठीक करने के लिए मैं बस किया:

NS.setTimeout = function (arg1, arg2) { 
    return win.setTimeout(arg1, arg2); 
}; 

हालांकि, मुझे नहीं पता कि यह क्यों तय हुआ। मुझे नहीं पता कि कौन सी भाषा यांत्रिकी इस व्यवहार का कारण बन रही है।

+0

स्वयं द्वारा असाइनमेंट ऐसी त्रुटि उत्पन्न नहीं करेगा। मुझे लगता है कि आपका प्रश्न गलत है। आपको इसका मतलब यह होगा कि ** आवंटित ** ** आवंटित मूल्य ने त्रुटि उठाई। –

+3

मुझे समझ में नहीं आता है। setTimeout() वैश्विक स्तर पर उपलब्ध है, है ना? यह सब क्यों करते हो? – Paul

+0

@Paul से सहमत: डी – Sebas

उत्तर

0

यह समस्या बी.एससी तय की गई। आप इसे कॉल करते समय कॉलिंग ऑब्जेक्ट को मूल में बदल रहे हैं।

return win.setTimeout(arg1, arg2); 

संदर्भ (या यह) वापस खिड़की पर सेट करेगा जहां यह होना चाहिए। अन्य उत्तर इस तथ्य के समान हैं कि वे bind से apply का उपयोग कर संदर्भ को सही मान में बदलते हैं।

+0

फेंकता है आप एक कवि हैं और एक विद्वान महोदय! –

+0

मैं अपनी पूरी कोशिश करता हूं। –

8

यह क्या आप चाहते हैं:

NS.setTimeout = win.setTimeout.bind(win); 

या क्या आप पहले से ही करते हैं, अगर आप IE8 के साथ संगत होना चाहता हूँ।

क्योंकि setTimeout, कई window कार्यों की तरह, रिसीवर (this) window की जरूरत है।

एक और IE8 संगत समाधान, तुम्हारा से मेरी राय में और अधिक सुरुचिपूर्ण (क्योंकि यह सच है कि आप setTimeout द्वारा आवश्यक तर्क की संख्या पता उपयोग नहीं करता है),

NS.setTimeout = function(){ 
    return win.setTimeout.apply(win, arguments); 
}; 
+1

परिणाम को वापस न करें! – Bergi

+0

@ बर्गि सही! संपादित। –

4

कारण होगा क्यों आप कर सकते हैं ऐसा नहीं है क्योंकि, जब आप सोचते हैं, तो आप setTimeout के कॉल संदर्भ को बदल रहे हैं, जिसकी अनुमति नहीं है।
न ही इसे setInterval, और अन्य मूल वस्तुओं/कार्यों के लिए अनुमति है। दोबारा: अंगूठे का एक बड़ा नियम: यदि आप ऑब्जेक्ट ऑब्जेक्ट नहीं करते हैं, तो इसे स्पर्श न करें। के बाद से कार्यों जे एस में वस्तुओं रहे हैं, उस नियम उन पर भी लागू है, भी

check the specs on the global object और उसके गुण/builtin funcitons:

There are certain built-in objects available whenever an ECMAScript program begins execution. One, the global object, is part of the lexical environment of the executing program. Others are accessible as initial properties of the global object.

और इतने पर। लेकिन the lexical environment काफी महत्वपूर्ण है। कहीं और फ़ंक्शन के संदर्भ को निर्दिष्ट करके, आप बड़े पैमाने पर लेक्सिकल वातावरण का मास्किंग कर सकते हैं, या वैश्विक पर्यावरण (जैसे मैशप) का अधिक खुलासा कर सकते हैं।

+1

यह केवल सेटटाइमआउट के लिए विशिष्ट नहीं है। मैंने 'console.log' पर कॉपी करते समय भी यह समस्या देखी है। +1। –

+0

@ बिल-दबचर-कटिंग: मेरे उत्तर में संपादित किया गया, लेकिन चूंकि डाइस्ट्रॉय पहले यहां था, सबसे अच्छा उसका जवाब –

+1

स्वीकार करें "* यह 'समस्या * * अनुभाग जो आपने लिंक किया है, ओपीएस समस्या से कोई लेना देना नहीं है। – Bergi

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

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