javascript - 如何在 Javascript 中获取调用函数的名称?

标签 javascript

考虑以下示例。

var obj = function(){};

function apply(target, obj) {

    if (target && obj && typeof obj == "object") {
        for (var prop in obj) {
            target[prop] = obj[prop];
        }
    }

    return target;
}

apply(obj.prototype, {
    firstFunction: function (){
        this.secondFunction();
    },
    secondFunction: function (){
        // how do I know what function called me here?
        console.log("Callee Name: '" + arguments.callee.name + "'");
        console.log("Caller Name: '" + arguments.callee.caller.name + "'");
    }
});

var instance = new obj();

instance.firstFunction();

更新

两个答案都很棒。谢谢你。然后我研究了在对象中调用递归函数或父函数的问题,并在此处找到了解决方案。这将允许我在不使用 arguments.callee/caller 属性的情况下检索函数名称。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function

最佳答案

函数的名称 是该函数的不可变属性,在初始函数表达式中设置。

var notTheName = function thisIsTheName() { ... }

someObj.stillNotTheName = function stillTheName() { ... }

如果您的函数表达式没有名称,则(不出所料)无法通过名称来识别它。将函数分配给变量并没有给它一个名字;如果是这种情况,您将无法确定分配给多个变量的表达式的名称。

您应该设置 firstFunctionname 属性,将其表示为

firstFunction: function firstFunction(){
    this.secondFunction();
}

此外,arguments.callee 已弃用。参见 Why was the arguments.callee.caller property deprecated in JavaScript?对于 arguments.callee 的历史有很好的解释。

关于javascript - 如何在 Javascript 中获取调用函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412815/

相关文章:

javascript - Angular + Sharepoint Rest 不起作用

javascript - 将 Javascript 参数传递给 Node.js

javascript - 对象类型在消息传递中丢失

javascript - 除非开发工具打开,否则 Bootstrap 模式不会在 IE11 中显示

javascript - 如何使用 jQuery :contains(some text) selector but only select "some text" from "this is some text"?

Javascript - 根据键字符串从对象动态获取子值

javascript - 钛和合金 - 临时窗口被杀死时会关闭整个应用程序

javascript - 自调用匿名函数与面向对象的方法来防止影响全局命名空间

javascript - HTML/Javascript - 创建自动滚动的页面部分,并在顶部文本离开屏幕时将其删除

javascript - React Javascript 根的样式背景颜色