Javascript 将eval()与自定义全局变量一起使用

Javascript 将eval()与自定义全局变量一起使用,javascript,eval,global,Javascript,Eval,Global,调用eval()时,是否有方法指定要为全局使用的对象 (我不是问如何进行全局评估() 这不起作用,但这说明了我希望: var pseudoGlobal = {}; eval("x = 12", pseudoGlobal); pseudoGlobal.x; // 12 关键是真正的全局绑定不受代码eval()中的隐式变量声明(即没有var关键字)的影响 至于eval.call(pseudoGlobal,“x=12”)或eval.apply(pseudoGlobal,[“x=12”]),一些口译员

调用
eval()
时,是否有方法指定要为全局使用的对象

(我不是问如何进行全局评估()

这不起作用,但这说明了我希望:

var pseudoGlobal = {};
eval("x = 12", pseudoGlobal);
pseudoGlobal.x; // 12
关键是真正的全局绑定不受代码eval()中的隐式变量声明(即没有var关键字)的影响


至于
eval.call(pseudoGlobal,“x=12”)
eval.apply(pseudoGlobal,[“x=12”])
,一些口译员不允许这样做。

没有内置的方法来做到这一点。

我想到了两种解决方案:

  • eval
    ed代码中为所有分配添加前缀。i、 例如,您必须执行类似于
    o.x=12
    的操作,而不是
    x=12
  • 编写自己的Javascript解释器,对脚本进行沙盒处理,并返回一个包含所有指定变量的对象

当然,您可以用默认对象来指定属性值,如

with (pseudoGlobal) eval("x=12")
但不是为了创造一个财产。如果在当前执行上下文堆栈中找不到属性,则在全局对象中创建该属性。就这些。 你也可以尝试一些奇怪的事情:

//global code
var globalvars = {};
for (i in this)
    globalvars[i] = null;
with (pseudoGlobal) 
    eval("x=12")
for (i in this)
    if (!(i in globalvars))
{
    pseudoGlobal[i] = this[i];
    delete this[i];
}
如果您关心全局绑定,请尝试:

var globalvars = {};
for (i in this)
    globalvars[i] = this[i];
with (globalvars) 
    eval("x=12")

这样,将在globalvars中更改绑定。请注意,浅层复制只会阻止一个级别的绑定更改。

关于第二个代码块,这不会阻止脚本更改真实全局对象中的绑定。我从表面上回答了您的问题,但仍然没有完全丢失。。。更新了答案,如果我执行
eval(“'use strict”;“+code)
,虽然它限制了可以eval()的代码,但这会阻止在全局范围内创建其他绑定。这就给我们留下了2+级绑定的可能变异,可惜我们不能用Javascript创建自己的执行环境。Javascript必须有一些很好的理由来阻止这种情况。我觉得这比我想象的要复杂一点(原型链?构造函数?本机函数?),目的是在Javascript本身中创建一个隔离/控制/安全的执行环境。