我希望能够在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
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
在某些时候,必须将功能代码从字符串转换为可执行代码。 这可以通过(邪恶)评估来实现,但是如你所说,它的使用是不鼓励的。 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 */