你能把一个匿名方法(函数)动态地变成一个命名方法吗

Can you turn an anonymous method (function) into a named method dynamically?

本文关键字:一个 方法 函数 动态      更新时间:2023-09-26

给定此方法:

var obj = {}, obj.foo = function () {};

是否可以在创建方法后为其指定一个名称,使其看起来类似于:

var obj = {}, obj.bar = function bar() {};

foo方法是匿名的,并分配给一个属性。bar方法已命名并指定给特性。

你能把匿名的foo方法动态地变成一个命名的foo吗?函数对象上是否有可以设置的属性或类似的属性:

obj.foo.<name> = Object.keys(obj)[0];

请不要使用jquery。此外,这是在节点服务器应用程序中,因此跨浏览器问题无关紧要。

编辑:对我有用的答案是Daniel的链接:如何在Chrome中动态设置Javascript中的函数/对象名称。这种方法还处理函数的参数。

您不能重命名匿名函数的精确实例,但您可以使用闭包重新定义它并更改其名称,如下所示:

var obj = {};
// Anonymous function
obj.foo = function() {/* whatever */};
// Renaming...
obj.foo = (function(fn) {
    return function foo() {
        return fn.apply(this, arguments);
    }
})(obj.foo);
// Now try in the console:
obj.foo
> function foo() {
    return fn.apply(this, arguments);
}

总结在上面引用的其他帖子中找到的两个解决方案:

1) javascript中的动态函数名?

2) 如何在Chrome 中显示的Javascript中动态设置函数/对象名称

var foo, bar, name = "bar", renameFunction;
foo = function () {return "baz";}
bar = foo;
console.log(bar.name + " /  " + bar()); //  / baz;
//*************** Solution #1 **********************************************
renameFunction = function (name, fn) {
    return (new Function("noName", "return function " + name + 
        "(){ return noName() };")(fn));
}
bar = renameFunction(name, foo);
console.log(bar.name + " /  " + bar()); // bar / baz;
//*************** Solution #2 **********************************************
renameFunction = function (name, fn) {
    return (new Function("return function (call) {return function " + name +
        " () { return call(this, arguments) }; };")())(Function.apply.bind(fn));
};   
bar = renameFunction(name, foo);
console.log(bar.name + " /  " + bar()); // bar / baz;

他们都工作。第二个解决方案比较复杂,但我还不确定它增加了什么。

更新:第二个解决方案是更好的。它可以处理函数的参数,而第一个解决方案没有。