Javascript 动态变量、范围、沙箱?
需要使用自己的环境变量(不访问全局变量)在有限的范围内(在客户机上)执行匿名函数。 覆盖上下文这不是问题,但对于变量,我只看到一个选项-aeval。但是,由于eval应该处于边缘,我决定询问社区是否有其他解决方案 实际上,问题是: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(){"
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-我对本机方法的可能实现感兴趣