使用Array中的参数创建JavaScript函数

时间:2013-03-19 13:00:48

标签: javascript

我想以自动方式从字符串中创建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);
}

3 个答案:

答案 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