2013-01-06 97 views
13

如何用动态名称创建函数?例如:Javascript:动态函数名称

function create_function(name){ 
    new Function(name, 'console.log("hello world")'); 
} 
create_function('example'); 
example(); // --> 'hello world' 

此外,函数应该是一个函数对象,所以我可以修改对象的原型。

+0

你能解释一下你正在试图解决什么问题? – Philipp

+0

@Philipp:例如,OP可能有兴趣将另一个构造函数替换为另一个构造函数,但给它的原始构造函数名称相同,因此代码看到相同的函数名称。这可能是我面临的原因之一。但我确定还有其他人。 –

回答

11
window.example = function() { alert('hello world') } 
example(); 

name = 'example'; 
window[name] = function() { ... } 
... 

window[name] = new Function('alert("hello world")') 
+0

[添加小提琴](http://jsfiddle.net/mE2n5/)在你的答案。 –

+9

我不知道为什么错误的答案是高位。作者在运行时需要一个命名的函数,而不是要访问的全局名称。 –

+0

下面的帖子是比较好的方法还是这个呢? –

13

我一直在玩这个围绕在过去3小时,终于得到它至少几分优雅使用新功能的建议上其他线程:

/** 
* JavaScript Rename Function 
* @author Nate Ferrero 
* @license Public Domain 
* @date Apr 5th, 2014 
*/ 
var renameFunction = function (name, fn) { 
    return (new Function("return function (call) { return function " + name + 
     "() { return call(this, arguments) }; };")())(Function.apply.bind(fn)); 
}; 

/** 
* Test Code 
*/ 
var cls = renameFunction('Book', function (title) { 
    this.title = title; 
}); 

new cls('One Flew to Kill a Mockingbird'); 

如果你运行上面的代码,你应该看到下面的输出到您的控制台:

Book {title: "One Flew to Kill a Mockingbird"}