Javascript Eval和Function构造函数用法

时间:2012-12-15 13:52:21

标签: javascript

我正在尝试自我复制代码。出于对语言的热爱,我想用javascript编写它。

我正在编写一个编写函数代码的程序,该代码依次编写函数自己的代码等等。基本上,所需的过程是这样的:

  1. 我手动创建一个函数,它返回代码(包括一些随机性)和一个数值(建议的问题解决方案)。
  2. 我多次调用此函数,评估每个返回函数的结果,并继续该过程,直到我的代码足够好于我正在尝试的内容。
  3. 现在,我总是被告知如何eval is evil,如何never to use it等等。但是对于我的特定用例,似乎Function构造函数或eval正是我正在寻找的。

    因此,简而言之,问题是:

    eval / Function构造函数确实是我案例中使用的最佳工具吗?如果是这样,我想我会使用Function构造函数来确定执行的代码范围,但有没有办法真正限制它访问全局范围?另外,在我的情况下,eval使用的一些好的做法是什么?

2 个答案:

答案 0 :(得分:1)

我想我只想出了一些我可以使用的东西:

如果我使用node.js运行我的javascript代码,我可以使用vm模块,它允许我在新的上下文中安全地执行javascript代码,并且不会让执行的代码对本地或全局有任何访问权限范围。

  

vm.runInNewContext编译代码,然后在沙箱中运行并返回结果。    运行代码无权访问本地范围。对象沙箱将用作    代码的全局对象。沙箱和文件名是可选的,文件名仅用于    堆栈痕迹。

您可以在此处查看完整示例:vm.runInNewContext

这将允许我安全地评估代码,并且似乎是目前可用的最安全的方式(我发现)。我认为这是比eval或调用Function构造函数更好的解决方案。

谢谢所有帮助过的人。

答案 1 :(得分:0)

不幸的是,我认为没有办法阻止它访问全球范围。例如,假设在Web浏览器中我使用了这样的代码:

(function(window) {
   eval(script);
)(null));

每当脚本尝试访问窗口时 - 它都会出错,因为窗口为空。然而,知道自己在做什么的人总能做到这一点:

var global = (function() {
    return this;
}());

因为当你调用Crockford所谓的“函数调用样式”中的函数时,它总是绑定到全局变量。