2

我希望能够将函数存储在 ArangoDB 文档中。从我所见,这实际上是可能的,因为用户定义的 AQL 函数似乎以这种方式存储为纯字符串。我的问题是朝那个方向发展的:这些字符串之后如何转换为可调用函数?

现在我找到了一个我不太喜欢的可行解决方案(似乎不鼓励使用 eval)。我正在寻找更好的解决方案。我可以通过以下方式存储函数并在之后使用它们:

var fnString = "['a','b', function(a,b) { return a + b }]";
var fn = Function.apply(null, eval(fnString));
var someValue = fn(1,2)     //returns 3

有没有更好的方法来实现这一目标?

4

1 回答 1

1

在某些时候,函数代码必须从字符串转换为可执行文件。这可以通过 (evil) eval 来实现,但正如您所说,不鼓励使用它。Eval 可以执行任意代码,通常这不是人们想要的。

另一种方法是使用 Function 构造函数:

var fn = new Function('a', 'b', 'return a + b');
var someValue = fn(1, 2); // returns 3

使用 Function 构造函数限制了潜在的危害,因为代码不是直接执行的,而是仅在调用函数时执行。调用函数时,代码可能造成的潜在损害仅限于函数本身的范围。

所以总而言之,使用 Function 构造函数应该比使用 eval 好很多。尽管如此,JSLint 仍会告诉您 Function 构造函数是 eval。但是,如果您需要动态地从字符串创建函数,那么除了像这样将其静音之外,您无能为力。

/*jslint evil: true */
var fn = new Function('a', 'b', 'return a + b');
/*jslint evil: false */
于 2014-08-07T07:58:03.910 回答