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

时间:2012-09-13 18:48:24

标签: 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

2 个答案:

答案 0 :(得分:4)

为函数命名

像:

 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   firstFunction(){
        this.secondFunction();
    },
    secondFunction: function    secondFunction(){
        // 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();

看看这个question

答案 1 :(得分:3)

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

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

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

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

您应该将firstFunction的{​​{1}}属性设置为

name

此外,不推荐使用firstFunction: function firstFunction(){ this.secondFunction(); } 。有关arguments.callee的历史记录的详细解释,请参阅Why was the arguments.callee.caller property deprecated in JavaScript?