我正在尝试自我复制代码。出于对语言的热爱,我想用javascript编写它。
我正在编写一个编写函数代码的程序,该代码依次编写函数自己的代码等等。基本上,所需的过程是这样的:
现在,我总是被告知如何eval is evil,如何never to use it等等。但是对于我的特定用例,似乎Function构造函数或eval正是我正在寻找的。 p>
因此,简而言之,问题是:
eval / Function构造函数确实是我案例中使用的最佳工具吗?如果是这样,我想我会使用Function构造函数来确定执行的代码范围,但有没有办法真正限制它访问全局范围?另外,在我的情况下,eval使用的一些好的做法是什么?
答案 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所谓的“函数调用样式”中的函数时,它总是绑定到全局变量。