有没有办法在调用eval()
时指定用于全局的对象?
(我不是问如何做全局eval()。)
这不起作用,但这说明了我想要的内容:
var pseudoGlobal = {};
eval("x = 12", pseudoGlobal);
pseudoGlobal.x; // 12
关键是真正的全局绑定不受代码eval()'ed中隐式变量声明(即没有 var 关键字)的影响。
对于eval.call(pseudoGlobal, "x=12")
或eval.apply(pseudoGlobal, ["x=12"])
,有些口译人员不允许这样做。
答案 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
。