你能动态地将匿名方法(函数)转换为命名方法吗?

时间:2015-04-04 17:26:48

标签: javascript node.js function anonymous-function v8

鉴于此方法:

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

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

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

foo方法是匿名的,并分配给属性。 bar方法已命名并分配给属性。

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

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

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

编辑:对我有用的答案是Daniel的链接:How to dynamically set a function/object name in Javascript as it is displayed in Chrome。此方法还处理函数的参数。

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

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

1)Dynamic function name in javascript?

2)How to dynamically set a function/object name in Javascript as it is displayed in 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;

他们都工作。第二种解决方案更复杂,但我不确定它添加了什么。

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