Javascript - 显示调用方函数名称的通用函数

Javascript - generic function to display caller function name

本文关键字:函数 显示 调用 方函数 Javascript      更新时间:2023-09-26

我正在尝试创建一个通用函数(例如'displayFuncName(('(,我可以在不同的函数定义中调用它(例如'foo(('(,所以它将控制台.log函数名称(在这个例子中是'foo'(。像这样:

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

我知道过去以不同的方式询问过它,但似乎有一些不推荐使用的选项,其中一些只显示"displayFuncName"函数名称,这当然不是我想要的。

由于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

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

拥有函数名称(如果要使用 theCallerFunction.name,则拥有函数本身不是更容易吗?

这将以更简单的方式为您提供完全相同的结果。.name 被贬值的可能性也小得多。

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

我相信"arguments.callee.caller.name"是贬值的。

与其从每个方法调用泛型函数,不如使用类似

arguments.callee.caller.name

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

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

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();

无论哪种都适合您的要求。

一种解决方案是这样的:

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

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

看这里。