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

4

2 回答 2

4

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

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

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

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

您应该通过将firstFunction'name属性表示为

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

此外,arguments.callee已弃用。请参阅为什么 JavaScript 中不推荐使用 arguments.callee.caller 属性?对历史的一个很好的解释arguments.callee

于 2012-09-13T19:05:20.957 回答
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();

看看这个问题

于 2012-09-13T18:54:53.463 回答