【问题标题】:Javascript Eval and Function constructor usageJavascript Eval 和 Function 构造函数用法
【发布时间】:2013-06-10 08:08:47
【问题描述】:

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

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

  1. 我手动创建了一个函数,它返回代码(包括一些随机性)和一个数值(提出的问题解决方案)。
  2. 我多次调用此函数,评估每个返回函数的结果,然后继续该过程,直到我的代码足以满足我的要求。

现在,我一直被告知如何eval is evil,如何never to use it 等等。但是,对于我的特定用例,Function 构造函数或 eval 似乎正是我正在寻找的。​​p>

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

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

【问题讨论】:

  • 注意:我没有将其标记为遗传编程,因为问题严格与使用 eval/Function ctor 的语言特定实践有关,
  • 为了做你描述的事情,eval()Function() 构造函数是你唯一的工具。只有在不必要或不正确使用时它们才是邪恶的。
  • 受控环境怎么样?我知道我可以将 javascript 集成到另一种语言中并将其用于该语言内的脚本,有没有办法在 javascript VM 中限定 javascript VM 以防止范围违规? (我没有使用浏览器)
  • 嗯,你可以使用 Java 中的 Rhino,但这有点痛苦。如果你正在做一个研究项目,我不明白为什么保护全球范围很重要,而且这可能是不可能的。

标签: javascript


【解决方案1】:

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

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

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

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

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

感谢所有帮助过的人。

【讨论】:

  • 是的,这比 eval 好得多,以防您确实希望它在新的上下文中使用 nodejs。
  • 谢谢,如果您有任何其他建议,我很想听听。无论如何,对于 javascript 环境,nodejs 似乎是一个不错的选择。
  • 是的,如果您不需要浏览器并且不想在 JVM 中使用它(Rhino 可能是首选),这几乎是唯一的好选择
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 您甚至不需要显式引用全局范围来访问全局变量。
猜你喜欢
  • 2012-05-07
  • 2011-03-02
  • 2018-07-19
  • 2017-11-04
  • 1970-01-01
  • 2018-08-20
  • 2017-06-12
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多