2011-12-02 14 views
33

तरहArguments.callee बहिष्कृत है - इसके बजाय क्या उपयोग किया जाना चाहिए?

setTimeout(function() { 
    ... 
    setTimeout(arguments.callee, 100); 
}, 100); 

काम करने के लिए मैं arguments.callee की तरह कुछ की जरूरत है। मैंने पाया information at javascript.info कि arguments.callee अब मान्य नहीं है:

यह गुण नामित समारोह भाव के पक्ष में और बेहतर प्रदर्शन के लिए ECMA-262 द्वारा मान्य नहीं है।

लेकिन इसके बजाय इसके बाद क्या उपयोग किया जाना चाहिए? ऐसा कुछ?

setTimeout(function myhandler() { 
    ... 
    setTimeout(myhandler, 100); 
}, 100); 
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace 

बीटीडब्ल्यू, arguments.callee क्रॉस-ब्राउज़र संगत है?

+2

क लिए:

function callback(){ //... setTimeout(innercall(), 100); function innercall(){ //innercall is safe to use in callback context innercall.caller(); //this will call callback(); } } 

फिर हम कॉलबैक संदर्भ में जो कुछ भी हम चाहते हैं सुरक्षित हैं इसके लायक है: [नामित कार्य अभिव्यक्ति demystified] (http://kangax.github.com/nfe/)। – sdleihssirhc

+0

हां, आपको अपने फ़ंक्शन का नाम देना चाहिए और सेटटाइमआउट में इसका नाम उपयोग करना चाहिए। – kubetz

+1

संभावित डुप्लिकेट [जावास्क्रिप्ट में arguments.callee.caller प्रॉपर्टी को बहिष्कृत क्यों किया गया था?] (Http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- जावास्क्रिप्ट) – cHao

उत्तर

10

हां, यही है, सैद्धांतिक रूप से, का उपयोग किया जाना चाहिए। आप सही हे। हालांकि, यह हमेशा के रूप में इंटरनेट एक्सप्लोरर के कुछ संस्करणों में काम नहीं करता है। तो सावधान रहें।

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

कौन सा IE पर काम करता है: आप arguments.callee पर वापस आने का नहीं बल्कि एक साधारण आवश्यकता हो सकती है, या,।

+1

रुको - आप कहना चाहते हैं कि 'setTimeout (function myhandler() {setTimeout (myhandler ...' IE के कुछ संस्करणों में काम नहीं करेगा? क्या यह एक गैर-मानक बात है? मैंने सोचा कि यह करने के लिए एक सुंदर मानक बात है – TMS

+3

@ टॉमसैट .: यह * मानक * है - लेकिन जब से आईई कभी पूरी तरह से मानक रहा है? :) (ठीक है, शायद आईई 10।) मुझे याद है कि कुछ समय से इसे ऊपर उठाया जा रहा है। एक त्वरित परीक्षण से पता चलता है कि यह कोई मुद्दा नहीं है कम से कम आईई 7 में। शायद आईई 6। मेरे पास यह परीक्षण करने के लिए मेरे पास नहीं है। – Ryan

+0

माइक्रोसॉफ्ट के अनुसार, यह आईई 6 में काम करता है: https://docs.microsoft.com/en-us/scripting/javascript/reference/callee -प्रोपर्टी-तर्क- जावास्क्रिप्ट –

5

लेकिन इसके बजाय इसके बाद क्या उपयोग किया जाना चाहिए? ऐसा कुछ?

हां, आपने अपने स्वयं के प्रश्न का उत्तर दिया। अधिक जानकारी के लिए यहाँ देखें:

Why was the arguments.callee.caller property deprecated in JavaScript?

यह कारण है कि इस बदलाव किया गया था के बारे में एक बहुत अच्छी चर्चा है।

+0

धन्यवाद जोनाथन। – TMS

0

मिनीटेक उत्तर काफी अच्छा है, लेकिन इसमें एक और परिदृश्य गुम है। कॉलबैक नामक आपका घोषित फ़ंक्शन, जिसका अर्थ है दो चीजें, पहला फ़ंक्शन स्मृति में ऑब्जेक्ट होता है, और दूसरा, फ़ंक्शन का नाम केवल ऑब्जेक्ट को संदर्भित करने के लिए होता है। यदि आप, किसी भी कारण से इन दोनों के बीच संदर्भ तोड़ते हैं, प्रस्तावित कोड भी काम नहीं करेगा।

सबूत:

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

var callback2 = callback; //another reference to the same object 
callback = null; //break the first reference 
callback2(); //callback in setTimeout now is null. 

विवरण में developer Mozilla page से है:

चेतावनी: ECMAScript (ES5) के 5 वें संस्करण arguments.callee() कठोर मोड में का उपयोग बैन। द्वारा arguments.callee() का उपयोग करने से बचें या तो फ़ंक्शन अभिव्यक्ति का नाम दें या फ़ंक्शन घोषणा का उपयोग करें जहां फ़ंक्शन को स्वयं कॉल करना होगा।

स्पष्ट रूप से इस समाधान का पहला उदाहरण "या तो दे रही है समारोह से एक नाम भाव" है, लेकिन देखना है कि कैसे हम से निपटने कर सकते हैं "या एक समारोह घोषणा का उपयोग जहां एक समारोह में ही कॉल करना होगा" की सुविधा देता है और कि क्या लाएगा:

var callback2 = callback; 
callback = null; 
callback2(); //will work perfectly. 
+0

'कॉलर' अच्छा अभ्यास नहीं है , और यहां नमूना कोड वास्तव में एक टाइमआउट सेट नहीं लगता है। बस अपने घोषित समारोह को ओवरराइट न करें। – Ryan

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

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