2013-03-19 77 views
3

我想用自動方式從字符串中創建JavaScript中的函數對象,但我正在用參數掙扎一點。我目前可以做的是以下幾點:使用來自數組的參數創建JavaScript函數

var objectStr = "function(x) { return x; }"; 
var myFunc = Function("x", "{ return x; }"); 

如果我做一些假設,該函數將始終以「功能(X)」開始我可以這樣做:

var objectStr = "function(x) { return x;}"; 
var funcBody = objectStr.replace("function(x)", ""); 
var myFunc = Function("x", funcBody); 

這讓我接近自動方法。我也可以將字符串「x」分配給一個值,並將其作爲參數傳入。但是我真的很想去一個地方,我可以提供以下內容:

var objectStr = "function(x, y) { return x*y; }"; 

在這一點上我想提取出來的參數,x和y爲一個字符串數組。我確信我可以用正則表達式很明智地做到這一點。

var parameters = [ "x", "y" ]; 

但問題是,我現在該如何創建一個功能,有多個參數,從我的參數數組?

編輯

之所以想這樣做是爲了產生一個函數,回調。我無法控制這些參數的值。這個jQuery的例子來說明(雖然這不是我使用的庫)可能是:

// Define myFunc using approach above 
// then somewhere later in 3rd party code an itterator block 
// like below will call: 
jQuery(data).each(function() { 
    myFunc(this); 
} 
+0

你知道,你不必在一個函數聲明的參數,但仍可以訪問它們(然而,許多被髮送到你的函數)嗎? – 2013-03-19 13:03:56

+0

@MarkSchultheiss:我添加了一個編輯來幫助說明我的用例。我無法控制參數的值,它們將根據第三方代碼和回調進行分配。 – Ian 2013-03-19 13:07:55

回答

3
var parsedParameters = ["x", "y"]; 
var parsedBody = "return x*y"; 
var func = Function.apply(null, parsedParameters.concat(parsedBody)); 
    /*function anonymous(x,y) { 
     return x*y 
    }*/ 

它的工作原理是因爲:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.1

15.3.1函數構造函數被調用爲函數

當函數被調用爲函數而不是構造函數時,它被調用 創建並初始化一個新的Function對象。因此函數調用 函數(...)等價於具有相同參數的對象創建表達式新函數 函數(...)。

所以人們不必使用new,從而能夠使用的.apply.apply用於使用來自數組的參數調用函數。見Function#apply

傳遞給.apply.concat後的例子中,數組是:

["x", "y", "return x*y"] 

因此,靜態等效爲new Function("x", "y", "return x*y")

+0

邪惡!小心解釋它爲什麼起作用? – WTK 2013-03-19 13:08:20

+0

@WTK做編輯幫助? – Esailija 2013-03-19 13:10:36

+0

是的,謝謝:) – WTK 2013-03-19 13:14:48

0

你可以嘗試使用eval例如http://jsfiddle.net/tXe9T/

var objectStr = "function(x) { alert (x); }"; 
var evalStr = "var myfunc = " + objectStr; 
eval(evalStr); 
myfunc("HI"); 
-1

你可以使用eval你評估你的功能。喜歡這個。

http://jsfiddle.net/sujesharukil/3Qpfx/

var funcMultipleParam = "function(x,y) {return x*y;}", 
    FuncMultiple = eval("(" + funcMultipleParam + ")"); 

alert(FuncMultiple(10, 20)); 

希望有所幫助。

SUJ

+0

反對?原因? – 2013-03-19 13:20:37