2

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

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

  1. 我手动创建了一个返回代码(包括一些随机性)和数值(提出的问题解决方案)的函数。
  2. 我多次调用这个函数,评估每个返回函数的结果,然后继续这个过程,直到我有足够好的代码来做我想做的事情。

现在,我总是被告知eval 是多么邪恶,如何永远不要使用它等等。但是,对于我的特定用例,Function 构造函数或 eval 似乎正是我正在寻找的。

所以,简而言之,问题是:

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

4

2 回答 2

1

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

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

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

你可以在这里看到一个完整的例子:vm.runInNewContext

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

感谢所有帮助过的人。

于 2012-12-15T14:10:37.860 回答
0

不幸的是,我相信没有办法阻止它访问全局范围。例如,假设在网络浏览器中我评估了一些这样的代码:

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

任何时候脚本试图访问窗口 - 它都会得到一个错误,因为窗口是空的。但是,知道自己在做什么的人总是可以这样做:

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

因为当您以 Crockford 所谓的“函数调用风格”调用函数时,this 总是绑定到全局变量。

于 2012-12-15T14:04:11.227 回答