2009-03-29 12 views
6

私はオブジェクトから関数を持っていますが、Object.MyFuncと言うことができます。 私はこの関数名を次のような別の関数に送る必要があります:doSomething( "Object.MyFunc");関数名を文字列に変換するにはどうすればいいですか?

アドバイスはありますか?あなたはdoSomething内からMyFuncを呼び出そうとしている場合

答えて

3

、あなただけの実際の関数を渡すことができます:関数名を取得するには本当に良い方法

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

ありません。 JavaScriptでは、匿名関数を持つことができます。したがって、名前を付けるための適切な方法はありません。

いずれにしても、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" 

ここでの制限は、あなたがオブジェクトと機能の両方が必要になりますということで、機能は反復可能でなければならないだろう - それは機能で構築することができないことを意味しています。

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

これは古い質問ですが、ES6ではこの機能はFunction.nameプロパティで提供されています。 ECMAScript 2015 Language Specificationは、how this property is added to a Function instance

9.2を定義します。11 SetFunctionName(F、名前、接頭辞)は

抽象操作SetFunctionNameFunction引数FString又はSymbol引数nameおよび任意String引数プレフィックスを必要とします。この操作は、次の手順を実行してFnameプロパティを追加します:それはhereはなど、すべてのIEのバージョンでサポートされていない列挙されています、とのみ:...

残念ながら、これはまだすべての主要なブラウザに実装されていません他のすべての主要なブラウザでは部分的にサポートされています(Edge 13は、まだ部分的ですが、現在は最高です)。

関連する問題