2012-06-15 16 views
5

मैं जावास्क्रिप्ट के मुख्य तरीकों में से एक को फिर से लिखने हूँ के नाम मिलता है:जावास्क्रिप्ट metaprogramming: वर्तमान में क्रियान्वित समारोह जो गतिशील रूप में लिखा गया था

Element.prototype._removeChild = Element.prototype.removeChild; 
Element.prototype.removeChild = function(){ 
    callback(); 
    this._removeChild.apply(this,arguments); 
} 

मैं गतिशील (इस मामले "removeChild" में) विधि का नाम प्राप्त करना चाहते हैं कार्य के अंदर से गतिशील रूप से फिर से लिखा जा रहा है। मैं arguments.callee.name का उपयोग करता हूं लेकिन ऐसा लगता है कि यह कुछ भी नहीं है, यह सोचकर कि यह सिर्फ एक अज्ञात कार्य है। मैं उस फ़ंक्शन का नाम कैसे प्राप्त करूं जो अज्ञात फ़ंक्शन को असाइन किया जा रहा है?

+4

जावास्क्रिप्ट विधियां नहीं:

आप फिर भी समारोह एक उचित नाम है जो आप arguments.callee.name के रूप में उपयोग कर सकते हैं दे सकते हैं। केवल गुणों को सौंपा गया कार्य। इस मामले में, 'Element.prototype.removeChild' एक ऐसी संपत्ति है जहां इसे असाइन किया गया है, इसे एक ही समय में कहीं और सौंपा जा सकता है। यह फ़ंक्शन का नाम नहीं है, इसका नाम नहीं है। फ़ंक्शन यह नहीं जानता कि इसे कितने गुणों को सौंपा गया है या यह किस संपत्ति को सौंपा गया है। – Esailija

उत्तर

5

यह एक गुमनाम समारोह है। तुम बस Element.prototype.removeChild संपत्ति इस अनाम समारोह बताए हैं, लेकिन उस समारोह के लिए है कि संपत्ति एक नाम नहीं है। आप एक ही फ़ंक्शन को कई चर और गुणों को असाइन कर सकते हैं, और उस नाम को जानने का कोई तरीका नहीं है जिसके द्वारा इसे कहा गया है।

Element.prototype.removeChild = function removeChild() { 
    .... 
} 
+0

आह 100% समझ में आता है। धन्यवाद! क्योंकि तब समारोह 'removeChild' द्वारा खुद का उल्लेख कर सकते – user730569

+1

+1 यह एकदम सही है, लेकिन' removeChild' अभी भी समारोह के बाहर अपरिभाषित है। आईई 8 और उससे नीचे के अलावा जो वास्तव में जावास्क्रिप्ट को सही ढंग से कार्यान्वित नहीं करता है। आईई 8 में और 'removeChild' के तहत बाहरी गुंजाइश (संभव वैश्विक) के संपर्क में है जब तक आप पूरी बात के चारों ओर एक बंद लपेट:' (function() {Element.prototype.removeChild = समारोह removeChild() {...})(); ' – Paulpro

+0

जब से तुम समारोह एक नाम दिया है, तो आप नाम के बजाय पदावनत' arguments.callee' उपयोग कर सकते हैं। लेकिन तब फिर से, 'removeChild.name' ...: पी – Esailija

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