我想以自动方式从字符串中创建JavaScript中的函数对象,但我在参数方面有点挣扎。到目前为止,我能做的是:
var objectStr = "function(x) { return x; }";
var myFunc = Function("x", "{ return x; }");
如果我做了一些假设,那么该函数将始终以“function(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 :(得分: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被调用为函数而不是构造函数时,它 创建并初始化一个新的Function对象。因此函数调用 函数(...)等同于对象创建表达式new 函数(...)具有相同的参数。
因此,不必使用new
,这可以使用.apply
。 .apply
用于调用带有来自数组的参数的函数。见Function#apply
示例中的数组在.apply
之后传递给.concat
:
["x", "y", "return x*y"]
所以静态等价物是new Function("x", "y", "return x*y")
答案 1 :(得分:0)
您可以尝试使用eval,例如http://jsfiddle.net/tXe9T/:
var objectStr = "function(x) { alert (x); }";
var evalStr = "var myfunc = " + objectStr;
eval(evalStr);
myfunc("HI");
答案 2 :(得分:-1)
您可以使用eval来评估您的功能。像这样。
http://jsfiddle.net/sujesharukil/3Qpfx/
var funcMultipleParam = "function(x,y) {return x*y;}",
FuncMultiple = eval("(" + funcMultipleParam + ")");
alert(FuncMultiple(10, 20));
希望有所帮助。
SUJ