2015-04-04 59 views
1

鉴于这种方法:你可以将一个匿名方法(函数)动态地变成一个命名方法吗?

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

是它的创建后,所以它看起来相似,它可以分配方法的名称:

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

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

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

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

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

编辑:对我有效的答案是丹尼尔的链接:How to dynamically set a function/object name in Javascript as it is displayed in Chrome。这种方法也处理函数的参数。

+2

为什么你需要这样的功能? – 2015-04-04 17:30:24

+0

除非您愿意获取函数的字符串值(即JavaScript源代码),修改该函数并从中创建新函数,否则没有办法做到这一点。你想达到什么目的?无论如何,函数外部的'function'表达式中给出的名字在函数外部是不可见的。 – Pointy 2015-04-04 17:30:36

+0

[命名匿名函数]可能的重复(http://stackoverflow.com/questions/3854141/naming-an-anonymous-function) – 2015-04-04 17:32:35

回答

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; 

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

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

1

你不能renane您的匿名函数是精确的实例,但你可以使用闭包来重新定义它改变它的名字,像这样:

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

@ChrisGciso我正在测试,我会告诉你,如果我找到 – 2015-04-04 18:38:19

相关问题