我有以下示例代码来获取函数名,该函数名被传递到回调参数中。
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发布于 2014-04-04 19:09:15
您的函数是匿名的;即它们是无名函数表达式。在你得到他们的名字之前,你必须给他们起名字。
var o = {
foo: function bar() {} // named function expression, name is "bar"
};
function getName(fn) {
return fn.name;
}
getName(o.foo); // "bar"然而,这些函数在您的operation对象中确实有相关的键,但是您不能确定某个对象的哪个键是确定的,查找匹配的代码只是猜测,因为值不必是唯一的。
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;不确定)
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('('));
}
});
}发布于 2014-04-04 19:01:33
function对象包含返回方法名称的" name“属性
更新名称,因为IE没有为使用RegEx的函数实现属性;)这个小函数可以帮助你:
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://stackoverflow.com/questions/22860870
复制相似问题