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

时间:2012-06-15 12:27:35

标签: javascript eval global

有没有办法在调用eval()时指定用于全局的对象?

(我不是问如何做全局eval()。)

这不起作用,但这说明了我想要的内容:

var pseudoGlobal = {};
eval("x = 12", pseudoGlobal);
pseudoGlobal.x; // 12

关键是真正的全局绑定不受代码eval()'ed中隐式变量声明(即没有 var 关键字)的影响。

对于eval.call(pseudoGlobal, "x=12")eval.apply(pseudoGlobal, ["x=12"]),有些口译人员不允许这样做。

2 个答案:

答案 0 :(得分:3)

当然,您可以替换分配属性值的默认对象,例如

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中更改。请注意,浅拷贝会阻止只有一个级别的更改。

答案 1 :(得分:1)

没有内置方法可以执行此操作。

有两种解决方案可供考虑:

  • eval ed代码中添加所有作业的前缀。即,而不是x = 12,你必须做o.x = 12
  • 之类的事情
  • 编写自己的Javascript解释器,对脚本进行沙盒化并返回包含所有已分配变量的对象。