我正在尝试在沙箱环境中执行一些javascript框。我尝试了几种方法,但我尝试过的所有库都不像浏览器那样工作。 这是我需要通过的测试列表,以完成我需要的: https://github.com/jurgob/js_questions/blob/master/src/utils/evaluateCode.test.js
基本上,这个名义函数内部应该是“全局”范围,如果我声明一个没有var的变量,或者使用var但是在“顶级”。完全像javascript应该工作。 (显然不是严格模式)。至少但并非最不重要的是,在执行之后,您的应用程序全局环境(窗口,在浏览器中)应该没有变量集(我的测试不能完美地测试它)。 所有这些要求都或多或少地用我写的测试来表达,所以我“只是”需要让它们变成“绿色”:)
这是我目前的实施: https://github.com/jurgob/js_questions/blob/master/src/utils/evaluateCode.js 它只是一个简单的评估,所以它不适合所有的测试。
这是我做的尝试:
a)我尝试了全局评估,但并未孤立(顺便说一下,这里有一篇有趣的文章:http://perfectionkills.com/global-eval-what-are-the-options/)
b)我使用new Function("window", "with(window){" + code + "}")({});
,它解决了没有var问题的变量,但函数内的this
仍然是错误的。
c)我使用了https://github.com/dfkaye/vm-shim,但是it(' function this = window with res = 5;',...
测试中的代码实际上没有沙箱和“它('函数this =窗口,var res = 5;',”它失败了cuz res未分配给全局范围
d)我尝试了https://github.com/asvd/jailed,即使我不喜欢将iframe添加到我的DOM中,但是在这里测试:http://asvd.github.io/jailed/demos/web/console/它似乎不能100%工作(我已经打开了)问题:https://github.com/asvd/jailed/issues/41
所以我现在的想法是,我可以使用acorn将所有功能绑定到全局对象并使用(this)执行js,如:
const context = {
log
}
cons sCode = code // replace all "function a(){}"" with "a=a.bind(this);function a(){} "
new Function("window", "with(window){" + sCode + "}")({});
但实施并不是那么微不足道,我不确定这是最好的方法