我有一个来自对象的函数,比如说Object.MyFunc。 我需要将此函数名称发送到另一个函数中,如下所示:doSomething(“Object.MyFunc”);
任何建议?
答案 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
参数F
,String
或Symbol
参数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);