首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Javascript获取作为回调参数传递的函数名

如何使用Javascript获取作为回调参数传递的函数名
EN

Stack Overflow用户
提问于 2014-04-04 18:58:02
回答 2查看 117关注 0票数 0

我有以下示例代码来获取函数名,该函数名被传递到回调参数中。

代码语言:javascript
复制
var operation = {
    display : function(fun) {
        console.log('operation "'+ fun.toString() +'" performing' );
        //here i am getting
        /*operation "function () { 
                console.log('operation "subtraction" performed' ); }" performing
        */
        // **instead of entire function i would like to get only method name**
        fun.call();
    },
    addition : function() {
        console.log('operation "addition" performed' );
    },
    subtraction : function() {
        console.log('operation "subtraction" performed' );
    },
    multiplication : function() {
        console.log('operation "multiplication" performed' );
    }
}
operation.display(operation.subtraction);
//Output should be
// operation "subtraction" performing
// operation "subtraction" performed
operation.display(operation.multiplication);
//Output should be
// operation "multiplication" performing
// operation "multiplication" performed
operation.display(operation.addition);
//Output should be
// operation "addition" performing
// operation "addition" performed
EN

回答 2

Stack Overflow用户

发布于 2014-04-04 19:09:15

您的函数是匿名的;即它们是无名函数表达式。在你得到他们的名字之前,你必须给他们起名字。

代码语言:javascript
复制
var o = {
    foo: function bar() {} // named function expression, name is "bar"
};
function getName(fn) {
    return fn.name;
}
getName(o.foo); // "bar"

然而,这些函数在您的operation对象中确实有相关的键,但是您不能确定某个对象的哪个键是确定的,查找匹配的代码只是猜测,因为值不必是唯一的。

代码语言:javascript
复制
function guessKey(val, obj) {
    var key;
    for (key in obj)
        if (obj[key] === val)
            return key;
    return null;
}
guessKey(o.foo, o); // "foo"

用于IE9+的Function.prototype.name填充(可能也是8;不确定)

代码语言:javascript
复制
if (Function.prototype.name === undefined) { // may be "" so can't use !
    Object.defineProperty(Function.prototype, "name", {
        get: function () {
                var s = Function.prototype.toString.call(this);
                return s.slice(9, s.indexOf('('));
            }
    });
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-04 19:01:33

function对象包含返回方法名称的" name“属性

更新名称,因为IE没有为使用RegEx的函数实现属性;)这个小函数可以帮助你:

代码语言:javascript
复制
function getFnName(fn) {
  var f = typeof fn == 'function';
  var s = f && ((fn.name && ['', fn.name]) || fn.toString().match(/function ([^\(]+)/));
  return (!f && 'not a function') || (s && s[1] || 'anonymous');
}

这里可以看到:https://gist.github.com/dfkaye/6384439

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22860870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档