我发现这个with
要点是使用和Harmony 直接代理为 3rd-party 代码实现沙箱。它有多大用处?是否可以使用代理实现适当的 javascript 沙箱?这种方法的怪癖和/或缺点是什么?
(我在这个问题中寻找一个纯 JavaScript 的解决方案,所以没有Caja和类似的服务器端项目)
我发现这个with
要点是使用和Harmony 直接代理为 3rd-party 代码实现沙箱。它有多大用处?是否可以使用代理实现适当的 javascript 沙箱?这种方法的怪癖和/或缺点是什么?
(我在这个问题中寻找一个纯 JavaScript 的解决方案,所以没有Caja和类似的服务器端项目)
原则上,这种方法应该可行。但是,有几点需要注意:
显然,这需要将所有不受信任的代码放入 with 范围。在实践中,这可能会变得相当笨拙。
此外,它巧妙地改变了包含在该代码中的最外层 var/function 声明的含义,这些声明现在变为本地而不是全局对象上的属性。另一方面,未声明的变量仍然会出现在全局对象上。这可能会破坏某些程序。
由于 'with' 的疯狂语义,现代 JavaScript VM 放弃了在其范围内优化代码的大多数尝试。对于具有“with”的东西,生成的代码很容易慢两个数量级。
所以总的来说,我不会推荐这种方法。使用 SES 或 Caja 会好得多(不确定在哪种意义上您称它们为服务器端)。
(同样值得注意的是,ES6 的模块加载器将提供一种更简洁的方式来沙箱化全局对象。但很难说这些何时可用。不会很快。)