2016-09-29 63 views
0

我想创建一个泛型函数(例如'displayFuncName()'),我可以在不同的函数定义中调用它(例如'foo()'),所以它将console.log函数名称(本例中为'foo')。 类似:Javascript - 显示调用者函数名称的泛型函数

var displayFuncName = function(){ 
console.log("caller function name: " + some parameter); 
} 

var foo = function(){ 
displayFuncName(); // should console log "caller function name: foo 
} 

我知道有人问在过去不同的方式,但似乎有一些过时的选项,而有些人只是显示了“displayFuncName”功能名,这当然是不是我想要的。

+1

'console.log(arguments.callee.name)' – Redu

+1

ECMAScript(ES5)的第5版禁止在严格模式下使用arguments.callee()。 –

+0

@Redu - 它会返回'displayFuncName' – Rayon

回答

0
console.log("caller is " + arguments.callee.caller.name); 
0

如果要使用函数名(或函数本身,如果您要使用CallerFunction.name)会不会更容易?

这会给你完全相同的结果,只是以一种更简单的方式。 .name将被折旧的可能性很小。

var displayFuncName = function(callerFunc){ 
console.log("caller function name: " + callerFunc.name); 
} 

var function = foo(){ 
displayFuncName(foo); 
} 

“arguments.callee.caller.name”被折旧我相信。

+0

'var function = foo(){'语法无效。 – evolutionxbox

+0

我想避免特别发送每个函数名称,因此它是通用的。 – user2880391

2

由于arguments.callee严格模式和arguments.caller抛出一个错误不再支持,也许类似的东西将是你更好的选择:

Function.prototype.logName = function() { 
    var fn = this; 
    return function() { 
     console.log(fn.name); 
     return fn.apply(this, arguments); 
    } 
} 

var f = function named() {}.logName(); 
f(); // logs `named` 

通过这种方式,你可以调用logName为每个函数你想在被调用时记录名字。

+0

这很好,但它很复杂,如果我做对了 - 我需要做专门的改变才能使它工作。 (如添加'named()',就像写两次函数的名字,并在末尾添加'logName()')。 – user2880391

+0

正如我所看到的,它不再需要专门的更改,而是将函数调用放入每个要为其记录名称的函数中。 _like添加'named()',就像写两次函数的名字一样 - 不,它是函数的名字。 'var f = function()' - 'f'不是这里的名字,'callee.name'不会给你'f'。最后'logName()'的作用与'bind'类似,并且可以控制哪些函数需要日志记录。这一切的目的是什么? –

0

与其说从每一个方法的通用功能,你可以使用像

arguments.callee.caller.name 

这会给你叫谁你的函数的函数的名称。 如果你在你的泛型方法中使用它,那么这会给你你想知道调用者的函数的名字。但是,如果你有一个共同的假设,你想知道你的调用者的来电者,你可以使用这样的东西。

firstFunction(); 
 

 
function firstFunction(){ 
 
secondFunction(); 
 
} 
 

 
function secondFunction(){ 
 
whoCalled(); 
 
} 
 

 
function whoCalled(){ 
 
alert("caller is " + arguments.callee.caller.arguments.callee.caller.name); 
 
}

0

一个解决办法是这样的:

var displayFuncName = function(o) { 
 
    console.log(o.name); 
 
} 
 

 
var foo = function(){ 
 
    displayFuncName(foo); 
 
    console.log(foo.name); // also possible 
 
} 
 

 
foo();

但你可以找到更多的方式解决。

See here.

0
​​

,或者如果你想整个其他的功能,那么你可以使用

var displayFuncName = function(){ 
console.log("caller function name: " + arguments.callee.caller.toString()); 
} 

var foo = function(){ 
displayFuncName(); // should console log "caller function name: foo 
} 
foo(); 

哪种适合您的需求。

+0

不适用于我 - 我得到空字符串 – user2880391