2013-01-06 75 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"}