Javascript 动态变量、范围、沙箱?

Javascript 动态变量、范围、沙箱?,javascript,scope,sandbox,dynamic-variables,Javascript,Scope,Sandbox,Dynamic Variables,需要使用自己的环境变量(不访问全局变量)在有限的范围内(在客户机上)执行匿名函数。 覆盖上下文这不是问题,但对于变量,我只看到一个选项-aeval。但是,由于eval应该处于边缘,我决定询问社区是否有其他解决方案 实际上,问题是: function sandbox(fn){ // with eval fn = fn.toString(); // need to dynamically create variables inside fn fn = '(function(){"

需要使用自己的环境变量(不访问全局变量)在有限的范围内(在客户机上)执行匿名函数。 覆盖上下文这不是问题,但对于变量,我只看到一个选项-aeval。但是,由于eval应该处于边缘,我决定询问社区是否有其他解决方案

实际上,问题是:

function sandbox(fn){ // with eval
   fn = fn.toString();
   // need to dynamically create variables inside fn 
   fn = '(function(){"use strict"; var window, document; (' + fn + ').call(this);}) ';
   fn = eval(fn);
   fn.call({}); // example
}

sandbox(function(){
   console.log(window, document, this); // return undefined, undefined, Object {}
});
要重新定义变量,必须响应函数sandbox()。我的意思是,在函数中对变量进行了明确的重新定义的函数不会被传输到提供。利用框架自身的环境动态创建框架,并将可变参数传递给函数

(function(window, document){...})(null, null)
也不适合它,所以一切都很清楚,这里需要通过沙盒()动态化这个过程。 没有使用eval还有其他解决方法吗


提前感谢。

注意事项可能重复,eval解决方案实际上不会保护
窗口
文档
。例如,假设
fn=“)};window.close()/“
@vldmir-这个问题问得很好,顺便说一句。但是已经有一些很好的答案了。@p.s.w.g-这是一个例子。您可以覆盖窗口的所有方法。问题是,如何不使用eval。@Jeremy J Starcher-我对本机方法的可能实现感兴趣