我正在用 JavaScript 编写一个简单的 REPL(读取、评估、打印、循环)实现。我能够像这样隔离代码和调用上下文:
var sandbox = {
// Allow the input code to use predefined helper functions
// without the preceding use of the this keyword.
helper_fn: function() { alert("foo"); }
};
var func = new Function("with (this) { " + user_inputed_code + " }");
func.call(sandbox);
现在它关闭 user_inputed_code
以便 this
引用 sandbox
并且如果输入的代码访问或改变 this
它正在影响 沙盒
。
但是,我注意到,如果输入的代码不小心忘记在变量赋值前加上关键字 var
,那么全局命名空间就会受到污染。
有什么办法可以防止这种情况发生吗?如果是这样的话(也许是正则表达式?)?有没有更好的方法来解决这个问题?
最佳答案
我将提供两种与其他人在此讨论的方法完全不同的方法。它们都很激进,并且在您想要相对隔离环境时很有用。
- 适用于所有浏览器的最简单技术可能是创建一个 iframe,然后向其附加脚本标记。 (请注意,如果它们在同一个域中,一个真正过分热心的 iframe 仍然可以通过,至少在旧浏览器中)。我在 this question 中对此进行了讨论.
- 使用 web Workers,默认情况下它有一个隔离的环境,并且无法访问主执行线程的全局对象。我讨论了in this question .
更具体地说,如果您正在构建 REPL,请查看 this answer我们讨论并解释如何使用 iframe 的第一种方法在相同范围但在全局范围之外评估代码。
(我假设是一个浏览器,在节点中你可以简单地使用 vm 模块并在 runInContext 中选择上下文)
关于javascript - 如何使用 javascript eval 防止意外的全局 namespace 污染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17872206/