0

假设我有一个像这样的对象:

var myObject = {};

myObject.myFunction = function() {
    var name = <some expression>; // name should be myFunction
}

我可以获取匿名函数内部分配匿名函数的对象属性的名称吗?

4

2 回答 2

4

没有通用的方法可以做到这一点。如果调用this引用对象的函数,则可以遍历对象的属性并比较值:

myObject.myFunction = function() { 
    var name;
    var func = arguments.callee;
    for (var prop in this) {
        if (this[prop] === func) {
            name = prop;
            break;
        }
    }
};

请注意,arguments.callee不推荐使用 ,取而代之的是命名函数表达式。也就是说,你应该这样做:

myObject.myFunction = function func() {  // <- named function expression
    var name;
    for (var prop in this) {
        if (this[prop] === func) {
            name = prop;
            break;
        }
    }
};

但是,我想知道你为什么需要这个。属性名称不应该对函数的内部工作产生影响,如果有,它似乎是 IMO 设计的糟糕。

于 2013-07-09T20:57:24.443 回答
0

@Felix Kling 的解决方案很棒,但它取决于被命名的函数表达式。正如他所说,如果您需要知道分配匿名函数的属性的名称,那么您的代码设计就很糟糕。不过,如果您想编写糟糕的代码,请改为这样编写:

function anonymous(method) {
    return function () {
        var args = Array.prototype.slice.call(arguments), name = "";

        for (var key in this) {
            if (this[key] === method) {
                name = key;
                break;
            }
        }

        return method.apply(this, args.concat(name));
    };
}

现在您可以像这样创建匿名函数:

var myObject = {};

myObject.myFunction = anonymous(function (name) {
    // function body
});

请记住,它name必须是函数的最后一个参数。

于 2013-07-10T02:31:35.440 回答