我正在用JavaScript编写一个简单的REPL(Read,Evaluate,Print,Loop)实现。我能够隔离代码和调用上下文,像这样:如何通过JavaScript eval来防止意外的全球名称空间污染?
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
参照网址到如果输入的代码访问或变异this
很影响。
但是,我注意到,如果推算代码不小心忘记了使用关键字var
的变量赋值,全局名称空间会被污染。
反正有防止这种情况吗?如果是这样(可能是正则表达式?)?有没有更好的方法来解决这个问题?
你能* EVAL *在一个单独的框架或窗口,有一个单独的*全球*对象的代码?顺便提一句,在ECAMScript中,“上下文”用于[* execution context *](http://www.ecma-international.org/ecma-262/5.1/#sec-10.3)。一个特定的执行上下文的* this *参数只是涉及所有参数和变量,作用域链等的“上下文”的一小部分。 – RobG
我打算在Titanium项目中使用它。所以帧不可用。但冻结可能会起作用。将不得不看运行时是否支持。 – Sukima
你可以在严格模式下运行代码吗?这样分配给未声明的变量会引发错误。尽管你不能使用*。用户仍然可以使用'window.foo = ...'创建全局变量。 – RobG