2011-01-19 21 views
13

मैं उस फ़ंक्शन के अंदर से फ़ंक्शन का नाम प्राप्त करना चाहता हूं। उदाहरण:एक्शनस्क्रिप्ट - वर्तमान फ़ंक्शन का नाम प्राप्त करें

function blah() { 
    //I want to get the string "blah" here, from the function's name 
} 

या कम से कम फ़ंक्शन ऑब्जेक्ट?

उत्तर

26

का उपयोग कर मौजूदा समारोह के लिए एक संदर्भ प्राप्त कर सकते हैं वर्तमान फ़ंक्शन का संदर्भ प्राप्त करने के लिए arguments.callee का उपयोग करें।

मैं फ़ंक्शन का नाम प्राप्त करना चाहता हूं, यह थोड़ा सा चालक है: सभी कार्यों को विधि बंद करने के रूप में माना जाता है (कोड के टुकड़े जिन्हें एक तर्क के रूप में पारित किया जा सकता है), इसलिए उनके पास एक संलग्नक का संदर्भ नहीं है कक्षा का प्रकार, न ही उनके पास "वर्तमान नाम" है।

हालांकि, अगर (और केवल अगर) विधि सार्वजनिक है, और आप विधि युक्त एक उदाहरण वस्तु के वर्ग घोषणा से विधि नाम प्राप्त करना चाहते हैं, तो आप describeType उपयोग कर सकते हैं:

public function someFunction() : void { 
    var callee:Function = arguments.callee; 
    trace (getFunctionName(callee, this)); // ==> someFunction 
} 

private function someOtherFunction() : void { 
    var callee:Function = arguments.callee; 
    trace (getFunctionName(callee, this)); // ==> not found 
} 

private function getFunctionName (callee:Function, parent:Object):String { 
    for each (var m:XML in describeType(parent)..method) { 
     if (parent[[email protected]] == callee) return [email protected]; 
    } 
    return "not found"; 
} 

ध्यान दें कि जब आप किसी निर्माता से someFunction() पर कॉल करते हैं तो यह काम नहीं करेगा, क्योंकि ऑब्जेक्ट पूरी तरह से तत्काल नहीं है - describeType(this) किसी कन्स्ट्रक्टर में संकलन त्रुटि का कारण बनता है।

+1

त्वरित नोट: यदि आप इसे किसी अन्य वर्ग से उपयोग करने में सक्षम होना चाहते हैं, तो आपको 'parent [m। @ Name]' –

+0

के साथ 'यह [m। @ Name] 'को प्रतिस्थापित करना होगा जो वास्तव में एक बग था। इसे मेरे ध्यान में लाने के लिए धन्यवाद, @ क्रिसवेल्श – weltraumpirat

2

शायद आप फ़ंक्शन का नाम प्राप्त नहीं कर पाएंगे, क्योंकि वास्तव में में "नाम" नहीं है। जैसे कि आपके चर के नाम नहीं हैं। वे सिर्फ एक वस्तु के लिए संकेतक हैं।

हो रही नाम मतलब नहीं है, आंशिक रूप से निम्न उदाहरण की वजह से:

function foo():void 
{ 
    //get function name. 
} 
var bar:Function = foo; 
bar(); 

एक समारोह किसी भी अन्य वस्तु/चर की तरह है। इस समारोह को "नाम" क्या मिलेगा? "Foo"? या "बार"? दोनों foo और bar प्रकार Function के समान चर संदर्भित कर रहे हैं।

को संभालने के लिए यह एक तर्क के रूप में कार्य करने में कुछ पारित करने के लिए किया जाएगा एक बेहतर तरीका:

function foo(myName:String):void 
{ 
    trace(myName); 
} 

आप तथापि, arguments.callee :)

+0

मुझे लगता है कि आप जो कह रहे हैं वह वास्तव में विश्वास करना मुश्किल है। यहां तक ​​कि जब मैं एक रिलीज संस्करण फ्लेक्स ऐप को ट्रेस कथन के साथ संकुचित करता हूं और कोई स्रोत दृश्य नहीं होता है, यदि कोई अनचाहे त्रुटि फेंक दी जाती है, तो फ़्लैश प्लेयर मुझे संबंधित वर्ग और इसके संबंधित पैकेज सहित _by name_ के तरीकों का अनुक्रम प्रदान करेगा। इससे मुझे पता चलता है कि _name_ जानकारी फ़ंक्शन निश्चित रूप से एसएफएफ में एन्कोड किया गया है, और इसलिए किसी भी तरह पहुंच योग्य होना चाहिए। – merv

+3

... अंतर यह है कि स्टैक को "बाहरी से" का पता लगाया गया है, एक आत्मनिर्भर ऑपरेशन के रूप में, जो कार्यक्रम की पूरी कक्षा और वस्तु पदानुक्रम को ज्ञात करने की अनुमति देता है, जबकि यह एक कार्य निकाय के भीतर से असंभव है। यदि आप समान कार्यक्षमता चाहते हैं, तो आपके पास हमेशा किसी प्रकार का "कस्टम स्टैक" हो सकता है जो आपके ऑब्जेक्ट को एक विधि कॉल का ट्रैक रखता है। – weltraumpirat

+0

@weltraumpirat - इसे स्पष्ट करने के लिए धन्यवाद। – merv

5

मैंने अभी इसे एक स्टैक ट्रेस के साथ किया है, जो फ्लैश प्लेयर डीबगर दिखाता है जब एक अनचाहे त्रुटि फेंक दी जाती है।

function blah() 
{ 
    var e:Error = new Error(); 
    var s:String = e.getStackTrace(); 
    var functionName:String = s.slice(s.indexOf('/')+1, s.indexOf('(')); 
    trace(functionName); //blah 
} 

आप शायद स्ट्रिंग को पार्स करने की आवश्यकता होगी थोड़ा अधिक सजावटी, अगर आप इस एक अलग समारोह बनाना चाहते: यहाँ मेरी कार्यान्वयन है। लेकिन समारोह का नाम निश्चित रूप से स्टैक ट्रेस में है।

संपादित करें: महत्वपूर्ण चेतावनी

AS3 Lang Ref का कहना है कि getStackTrace विधि केवल फ़्लैश प्लेयर/आकाशवाणी की डीबगर संस्करणों में काम करता है, और null अन्यथा वापस आ जाएगी। तो यह निश्चित रूप से एक तैनाती समाधान नहीं है। माफ़ कीजिये।

+1

संस्करण 11.5 के रूप में और बाद में यह गैर-डीबगर संस्करणों में उपलब्ध है। उद्धरण, 'फ्लैश प्लेयर 11.4 और इससे पहले और एआईआर 3.4 और इससे पहले, स्टैक निशान केवल तभी उपलब्ध होते हैं जब फ्लैश प्लेयर या एआईआर डीबग लॉन्चर (एडीएल) के डीबगर संस्करण में कोड चल रहा हो। उन रनटाइम के गैर-डीबगर संस्करणों में, इस विधि को कॉल करने से शून्य वापस आती है। '- http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Error.html –

0

जब मैं अपने घटना प्रणाली लागू करने के लिए कार्यों के लिए आईडी की जरूरत मैं एक गैर-अनाम समारोह एक तर्क के रूप में पारित की एक name पहुंचने का एक तरीका भी नहीं मिला तो मैं कि Function छोड़कर कुछ भी नहीं संग्रहीत एक आवरण लिखना पड़ा और इसके ID

2

इस Actionscript 2, जो मैं कुछ विरासत कोड

function getFunctionName(func:Function):String 
{ 
    for(var prop in this) 
    { 
    if(this[prop] == func) 
    { 
     return prop; 
     break; 
    } 
    } 
} 

साथ हाल ही में कर और यह

की तरह कुछ के लिए इसका इस्तेमाल किया था में हटा करने के लिए