6

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

(我不是在问如何进行全局 eval()。)

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

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

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

至于eval.call(pseudoGlobal, "x=12")or eval.apply(pseudoGlobal, ["x=12"]),有些口译员是不允许的。

4

2 回答 2

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

于 2012-06-15T13:01:10.320 回答
1

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

想到了两种解决方案:

  • eval在ed 代码中为所有分配添加前缀。即,x = 12您将不得不做类似的事情,而不是o.x = 12.
  • 编写您自己的 Javascript 解释器,将脚本沙箱化并返回一个包含所有已分配变量的对象。
于 2012-06-15T12:43:20.847 回答