3

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

3 回答 3

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 对象。因此,函数调用 Function(...) 等价于具有相同参数的对象创建表达式 new Function(...)。

因此,不必使用new,从而可以使用.apply.apply用于调用带有来自数组的参数的函数。见功能#apply

示例中传递给.applyafter的数组.concat是:

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

所以静态等价物是new Function("x", "y", "return x*y")

于 2013-03-19T13:05:06.000 回答
0

您可以尝试使用 eval 例如 http://jsfiddle.net/tXe9T/

var objectStr = "function(x) { alert (x); }";
var evalStr = "var myfunc = " + objectStr;
eval(evalStr);
myfunc("HI");
于 2013-03-19T13:06:56.737 回答
-1

您可以使用 eval 评估您的功能。像这样。

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

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

alert(FuncMultiple(10, 20));

希望有帮助。

苏杰

于 2013-03-19T13:17:02.287 回答