【发布时间】:2013-07-26 21:42:55
【问题描述】:
我正在用 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,它会影响sandbox。
但是,我注意到,如果估算的代码不小心忘记在变量赋值前加上关键字 var,那么全局命名空间就会被污染。
有没有办法防止这种情况发生?如果是这样(也许是正则表达式?)?有没有更好的方法来解决这个问题?
【问题讨论】:
-
您能否eval 将代码放在具有单独global 对象的单独框架或窗口中?顺便说一句,在 ECAMScript 中,“上下文”与execution context 相关。特定执行上下文的 this 参数只是“上下文”的一小部分,它引用所有参数和变量、作用域链等。
-
我计划在 Titanium 项目中使用它。所以框架不可用。但是冻结可能会起作用。必须看看运行时是否支持。
-
你能在严格模式下运行代码吗?这样分配给未声明的变量将引发错误。但是,您不能使用 with 。用户仍然可以使用
window.foo = ...创建全局变量。 -
@Sukima 我刚刚注意到您说您使用的是 Titanium,它允许您使用 createWindow 命令创建一个新的单独执行上下文。您的应用程序可以有多个执行上下文。新的执行上下文通常是通过打开一个指向其 url 属性中的外部 URL 的新窗口来创建的:
Ti.UI.createWindow({url:'yourscriptfile.js'}).open();您可以在上下文之间传递消息。请参阅本指南:developer.appcelerator.com/blog/2010/12/…
标签: javascript