2014-04-04 167 views
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 
+2

你能否澄清一点?什么是问题?删除代码中不相关的部分并对其进行格式化,这也有帮助。 – Nenotlep

回答

1

函数对象包含“名”的财产返还的方法的名称

UPDATE AS的功能使用正则表达式IE不实现name属性;)这个小功能可以帮助你出去:

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

+2

'name'在这种情况下不起作用,因为传递的函数被定义为匿名函数。它将简单地返回'“”',而不是它所定义的属性的名称。另外,'name'在任何版本的IE中都不可用,包括IE11。 –

+0

你是对的。看到我的更新! – codedrop

+0

这仍然不幸没有显示匿名函数的属性名称(它返回“匿名”),但如果不改变方法就不容易解决。 –

2

ÿ我们的职能是匿名的;即它们是无名称函数表达式。在你得到他们的名字之前,你必须给他们的名字。

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" 

Function.prototype.name垫片为IE9 +(也许还有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('(')); 
      } 
    }); 
}