javascript - 如何使用 javascript eval 防止意外的全局 namespace 污染?

标签 javascript

我正在用 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/

相关文章:

javascript - 获取json数据响应?

javascript - 如何配置 MathJax 以在 HTML 中呈现化学方程式?

javascript - 触发事件的顺序

javascript - Highcharts donut 派/图例位置

javascript - 更改视频源而不停止 HTML5 视频

javascript - 无法在 Cordova 内使用postMessage

javascript - addChild 给出错误,JavaScript

javascript - 无法更新指令模型

javascript - 如何在 iframe 中显示表单成功

javascript - 将列表包装成列