假设我有一个像这样的对象:
var myObject = {};
myObject.myFunction = function() {
var name = <some expression>; // name should be myFunction
}
我可以获取匿名函数内部分配匿名函数的对象属性的名称吗?
假设我有一个像这样的对象:
var myObject = {};
myObject.myFunction = function() {
var name = <some expression>; // name should be myFunction
}
我可以获取匿名函数内部分配匿名函数的对象属性的名称吗?
没有通用的方法可以做到这一点。如果调用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 设计的糟糕。
@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
必须是函数的最后一个参数。