如何将函数名称转换为字符串

时间:2009-03-29 21:52:11

标签: javascript

我有一个来自对象的函数,比如说Object.MyFunc。 我需要将此函数名称发送到另一个函数中,如下所示:doSomething(“Object.MyFunc”);

任何建议?

6 个答案:

答案 0 :(得分:4)

获取函数名称的方法并不是很好。在JavaScript中,您可以使用匿名函数,因此没有合适的方法来命名它们。

无论如何,使用arguments.callee.toSring()可能会有运气。例如:

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

但是,这很糟糕,因为并非所有函数都有名称,而且某些浏览器可能会在此字符串中附加特定于实现的详细信息。

但是,也许除了获得这个名字之外,你还想尝试别的什么?如果你想最终调用该函数,你可以实际传递函数本身。这称为lambda函数。例如:

function foo(inFunc) {
    inFunc();
}

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

上面的代码创建了一个弹出警报的匿名函数。然后将它传递给foo函数,该函数只调用传递给它的函数。

答案 1 :(得分:3)

如果您尝试从MyFunc内拨打doSomething,则可以通过实际功能:

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

答案 2 :(得分:3)

这是一个老问题,但在ES6中,此功能是通过Function.name属性提供的。 ECMAScript 2015 Language Specification定义how this property is added to a Function instance

  

9.2.11 SetFunctionName(F,name,prefix)

     

抽象操作SetFunctionName需要Function参数FStringSymbol参数name,并且可选String参数前缀。此操作通过执行以下步骤将name属性添加到F:...

不幸的是,这还没有在所有主流浏览器中实现:它列在here所有IE版本都不支持,并且只在部分所有其他主流浏览器中得到部分支持(尽管Edge 13具有最佳功能,但是还是部分,目前支持。

答案 3 :(得分: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"

这里的限制是你需要对象和函数,并且函数必须是可迭代的 - 这意味着它不能是内置函数。

答案 4 :(得分:1)

也许你的意思是这样的?

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

循环遍历对象并传递一个包含方法名称和指向方法的指针(或错误消息)的数组。

答案 5 :(得分:-1)

如果你有这个功能:

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

您可以这样称呼它:

function testTest(func)
{
   func();
}

testTest(test);