2009-03-29 17 views
6

में कैसे परिवर्तित करूं, मेरे पास ऑब्जेक्ट से कोई फ़ंक्शन है, ऑब्जेक्ट। MyFunc कहें। मुझे इस फ़ंक्शन का नाम किसी अन्य फ़ंक्शन में भेजने की आवश्यकता है: doSomething ("Object.MyFunc");मैं फ़ंक्शन नाम को स्ट्रिंग

कोई सलाह?

उत्तर

3

आप doSomething के भीतर से MyFunc कॉल करने के लिए कोशिश कर रहे हैं, तो आप सिर्फ वास्तविक समारोह पारित कर सकते हैं:

var someObject = new Object(); 
someObject.MyFunc = function() { alert('test'); } 
function doSomething(func) { 
    func(); 
} 
doSomething(someObject.MyFunc); 
4

वहाँ समारोह नाम पाने के लिए एक बहुत अच्छी तरह से नहीं है। जावास्क्रिप्ट में, आपके पास अनाम कार्य हो सकते हैं और इसलिए उन्हें नाम देने का कोई अच्छा तरीका नहीं है।

किसी भी मामले में, आपको arguments.callee.toSring() का उपयोग करके कुछ भाग्य हो सकता है। उदाहरण के लिए:

function foo() { 
    alert("I am " + arguments.callee.toString()); 
} 

लेकिन, इस गरीब क्योंकि सभी कार्यों नाम है और कुछ ब्राउज़र इस स्ट्रिंग के लिए कार्यान्वयन-विशिष्ट विवरण संलग्न कर सकते हैं।

लेकिन, शायद आप नाम पाने के अलावा कुछ और करने की कोशिश कर रहे हैं? यदि आप अंततः फ़ंक्शन को कॉल करना चाहते हैं, तो आप वास्तव में फ़ंक्शन को पास कर सकते हैं। इसे लैम्ब्डा फ़ंक्शन कहा जाता है। उदाहरण के लिए:

function foo(inFunc) { 
    inFunc(); 
} 

foo(function() { alert("foo"); }); 

उपरोक्त कोड को उस अज्ञात फ़ंक्शन एक चेतावनी पॉप अप होता है पैदा करता है। इसके बाद इसे foo फ़ंक्शन में पास किया जाता है जो कि जो कुछ भी कार्य करता है उसे कॉल करता है।

-1

आप इस समारोह है, तो:

function test() 
{ 
    alert('here'); 
} 

आप इस तरह से यह कॉल कर सकते हैं:

function testTest(func) 
{ 
    func(); 
} 

testTest(test); 
1

के रूप में अन्य लोगों ने बताया है, यह सबसे अधिक संभावना है कि जो कुछ भी तुम क्या करने की कोशिश कर रहे है बेहतर तरीके से किया जा सकता है। हालांकि, अगर आपको वास्तव में किसी फ़ंक्शन का नाम ढूंढना है, तो ऐसा करने का एक आसान तरीका है, लेकिन यह सभी मामलों में काम नहीं करेगा। जिसका अर्थ यह एक समारोह में बनाया नहीं किया जा सकता है कि -

//returns the name of the function func on the object obj 
function getFuncName(obj, func){ 
    for(var funcName in obj){ 
    if(obj[funcName] === func){ 
     return funcName; 
    } 
    } 
} 

alert(getFuncName(Object, Object.MyFunc)); //alerts "MyFunc" 

यहाँ सीमा है, कि तुम दोनों वस्तु और समारोह की आवश्यकता होगी, और समारोह iterable होना जरूरी नहीं है।

1

शायद आप इस तरह कुछ मतलब है?

function getFn(fnName){ 
    for (var l in yourObj){ 
     if (l === fnName && yourObj[l] instanceof Function){ 
     return [ l, yourObj[l] ]; 
     } 
    } 
    return [fnName ,'not found']; 
} 

वस्तु के माध्यम से पाश दोहराता और विधि नाम और विधि (या कोई त्रुटि संदेश) के लिए सूचक युक्त एक सरणी देता है।

2

यह एक पुराना सवाल है, लेकिन ईएस 6 में यह क्षमता Function.name संपत्ति के माध्यम से प्रदान की जाती है। ECMAScript 2015 Language Specificationhow this property is added to a Function instance परिभाषित करता है:

9.2।11 SetFunctionName (एफ, नाम, उपसर्ग)

सार आपरेशन SetFunctionName एक Function तर्क F, एक String या Symbol तर्क name और वैकल्पिक रूप से एक String तर्क उपसर्ग की आवश्यकता है। इस आपरेशन निम्नलिखित चरणों को करके F करने के लिए एक name संपत्ति कहते हैं: ...

दुर्भाग्य से, यह अभी तक सभी प्रमुख ब्राउज़रों में लागू नहीं किया गया: यह here के रूप में सभी आईई संस्करणों में समर्थित नहीं सूचीबद्ध है, और केवल आंशिक रूप से अन्य सभी प्रमुख ब्राउज़रों में समर्थित है (एज 13 के साथ सबसे अच्छा है, यद्यपि अभी भी आंशिक है, वर्तमान में समर्थन)।

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