你能把一个匿名方法(函数)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没有的函数的参数。