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

鉴于此方法:

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

是否可以在创build后为该方法分配一个名称,使其看起来类似于:

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

foo方法是匿名的,并被分配给一个属性。 小节方法被命名并分配给一个属性。

你可以把匿名foo方法dynamic地变成一个名为foo的方法吗? 是否有可以设置或类似的function对象的属性:

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

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

编辑:我工作的答案是丹尼尔的链接: 如何在Javascript中dynamic设置一个函数/对象的名称,因为它显示在Chrome中 。 这种方法也处理函数的参数。

你不能回忆你的匿名函数的精确实例,但你可以使用闭包来重新定义它的名字,如下所示:

 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); } 

总结上面引用的其他post中的两个解决scheme:

1) 在JavaScript中的dynamic函数名称?

2) 如何在Javascript中dynamic设置一个函数/对象名称,因为它显示在Chrome中

 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; 

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

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