2009-12-20 3 views
8

मैं वर्तमान में चल रहे फ़ंक्शन का नाम प्राप्त करने का प्रयास कर रहा हूं। , जब मैं फ़ायरफ़ॉक्स और सफारी में इस (नवीनतम संस्करण मैक पर) चलानेजावास्क्रिप्ट - arguments.callee.toString() और arguments.callee.name फ़ंक्शन का नाम वापस नहीं करता है

(arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/) 

हालांकि नाम वापस नहीं किए गए: मैं क्या पढ़ा है से, यह संभव का उपयोग करते हुए होना चाहिए।

console.log (arguments.callee) फ़ंक्शन का स्रोत देता है, लेकिन निर्दिष्ट नाम नहीं। arguments.callee.name एक खाली स्ट्रिंग देता है।

मेरे नमूना कोड इस प्रकार है:

var testobj = { 
    testfunc: function(){ 
     console.log((arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/)); 
    } 
} 
testobj.testfunc(); 
+0

मैं पूछ सकता हूँ, तुम क्यों चाहते हैं/यह करने के लिए की जरूरत है? – James

+0

याहू। तो मैं फ़ंक्शन चेनिंग से युक्त एक पालतू परियोजना पर काम कर रहा हूं। मेरे पास लगभग 50 अलग-अलग फ़ंक्शन हैं जो सभी एक ही कोड चलाते हैं, सिवाय इसके कि उनमें एक विशेष चर को फ़ंक्शन के समान नाम के रूप में परिभाषित किया गया है। मैं सभी डुप्लिकेशंस को एक ऐसे फ़ंक्शन में कम करना चाहता हूं जो कॉलिंग फ़ंक्शन के नाम का पता लगाता है और उस नाम का उपयोग उस चर के रूप में करता है जो वर्तमान में हार्ड कोड है। इस विधि के साथ, मैं एक पंक्ति में मेरी कार्यों के सभी परिभाषित कर सकते हैं। – Geuis

+2

'toString()' इस तरह के कार्यों जैसे कार्यों (उर्फ फ़ंक्शन "डिकंपिलेशन") में इसके वार हैं। देखें http://perfectionkills.com/those-tricky-functions/, http://perfectionkills.com/detecting-built-in-host-methods/, http://my.opera.com/hallvors/blog/show .dml/1665828 और http://my.opera.com/hallvors/blog/2007/07/07/prototype-findorstore-cononsidered-harmful –

उत्तर

7

ठेठ arguments.callee हैक्स यहाँ काम नहीं करते: यहां बताया गया एक समारोह का नाम (के रूप में यह बदला जा सकता है, name संपत्ति का उपयोग नहीं करते) प्राप्त करने के लिए है ऑब्जेक्ट की 'testfunc' कुंजी के मान के रूप में अनाम कार्य। इस मामले में हैकिंग भी खराब हो जाता है, लेकिन यह, किया जा सकता है इस प्रकार है:

var testobj = { 
    testfunc: function(){ 
     for (var attr in testobj) { 
       if (testobj[attr] == arguments.callee.toString()) { 
        alert(attr); 
        break; 
       } 
      } 
    } 
} 
testobj.testfunc(); 
10

आप

function(){ 

साथ एक गुमनाम समारोह घोषित आप के रूप

function testfunc(){ 

नाम मुद्रित करने के लिए यह घोषणा करनी चाहिए।

+5

ध्यान रखें कि नामित फ़ंक्शन एक्सप्रेशन (जो आप सुझाव दे रहे हैं) आईई में अजीब व्यवहार करते हैं। अच्छा बिंदु और दिलचस्प पढ़ने Tim.Down देखें http://yura.thinkweb2.com/named-function-expressions/ –

+0

@। –

+0

स्पष्टीकरण के लिए: उपरोक्त ऑब्जेक्ट शैली के मामले में '{testfunc: function testfunc() {...' होगा। ब्राउज़र में चीजों को डीबग करते समय यह करना भी अच्छा होता है, डीबगर सहायता में आपको यह देखने में मदद मिलती है कि आपको किस फंक्शन में समस्या है। – clacke

2
/function\s+(\[^\s\(]+)/ 

[ से पहले बैकस्लैश के साथ क्या है? मुझे नहीं लगता कि आप यहां एक शाब्दिक वर्ग ब्रैकेट चाहते हैं। इसके बिना यह काम करना चाहिए।

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

0

सबसे पहले, फ़ंक्शन का नाम नहीं है। फ़ंक्शन नाम वह है जो आपने function के बीच रखा है और तर्क सूची (...) है। क्योंकि तुम क्या किया है एक असाइन किया गया है

var fName = arguments.callee.toString(0).match(
    /^function\s*(?:\s+([\w\$]*))?\s*\(/ 
); 
fName = (fName ? fName[1] : ""); 
+0

"नाम संपत्ति का उपयोग न करें, क्योंकि इसे बदला जा सकता है" - ठीक है, toString() विधि को भी बदला जा सकता है ... –

0

मैंने पाया कि आप बस समारोह वस्तु है, तो जैसे लोग इन यदि:

console.log(arguments.callee) 

या

console.debug(arguments.callee) 

कि आप बस कुछ विकल्पों के साथ कंसोल लॉग में फ़ंक्शन नाम प्राप्त करते हैं।

3

Firefox 3.5, सफारी 5, और क्रोम 6.0 पर आप उपयोग कर सकते हैं:

function myFunctionName() { 
alert("Name is " + arguments.callee.name); 
} 

myFunctionName(); 

तुम भी समारोह है कि वर्तमान एक arguments.callee.caller का उपयोग कर कहा जाता है प्राप्त कर सकते हैं।

2

मुझे लगता है कि इस सब के लिए एक बहुत साफ और सुरुचिपूर्ण समाधान है।समारोह कुछ उच्च स्तर वस्तु — के एक सदस्य मानते हुए है और वह हमेशा की तरह, मामला हो जा रहा है, भले ही समारोह के मालिक "विंडो" या कुछ अन्य वैश्विक वस्तु है, हम इस कीवर्ड के माध्यम से वैश्विक वस्तु का उपयोग कर सकते, हम arguments.callee के माध्यम से समारोह में ही उपयोग कर सकते हैं और हम (इस में वर ओ) के लिए के माध्यम से सभी माता पिता की वस्तु (समारोह) के नाम का उपयोग कर सकते हैं, ताकि आप काफी आसानी से के रूप में वांछित जानकारी प्राप्त करने में सक्षम होना चाहिए .. ।

returnMyName = function() { 
    for (var o in this) { 
    if (arguments.callee===this[o]) return o; 
    } 
}; 

कि मजबूत हो सकता है और नामित कार्यों तक पहुँचने के लिए किसी भी अजीब IE ब्राउज़र व्यवहार से बचना चाहिए, आदि

1
Function.prototype.getName = function(fn) { 
    if(Function.name || Function.prototype.name) return this.name; 
    return this.toString().match(/^function\s+(\w+)\s*\(/)[1]; 
}; 
+0

कृपया उत्तर का विवरण जोड़ें ! – bahrep

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