Javascript - 显示调用者函数名称的泛型函数

时间:2016-09-29 08:56:22

标签: javascript function generic-programming

我正在尝试创建一个泛型函数(例如'displayFuncName()'),我可以在不同的函数定义中调用它(例如'foo()'),因此它将在console.log中创建函数名称(' foo'在这个例子中)。 类似的东西:

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

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

我知道过去曾以不同方式询问过,但似乎有一些不赞成的选项,其中一些只是显示'displayFuncName'函数名,这当然不是我想要的。

6 个答案:

答案 0 :(得分: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来查找要在其调用时记录名称的每个函数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你要使用theCallerFunction.name,那么拥有函数名称(或函数本身)会不会更容易?

这将以更简单的方式为您提供完全相同的结果。 .name也不太可能被折旧。

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

var function = foo(){
 displayFuncName(foo); 
}
我相信

“arguments.callee.caller.name”是折旧的。

答案 3 :(得分:0)

您可以使用类似

的内容,而不是从每个方法调用泛型函数
arguments.callee.caller.name

这将为您提供调用您的函数的函数的名称。 如果在泛型方法中使用它,那么将为您提供要在其中了解调用者的函数的名称。但是,如果你有一个共同的假设,你想知道你的呼叫者的呼叫者,你可以使用这样的东西。

firstFunction();

function firstFunction(){
secondFunction();
}

function secondFunction(){
whoCalled();
}

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

答案 4 :(得分:0)

一个解决方案就是:

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

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

foo();

但是你可以找到更多解决方案。

See here.

答案 5 :(得分:0)

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

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

或者如果您想要整个功能,那么您可以使用

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

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

符合您的要求。