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

gaw*_*awi 6 javascript global eval

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

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

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

var pseudoGlobal = {};
eval("x = 12", pseudoGlobal);
pseudoGlobal.x; // 12
Run Code Online (Sandbox Code Playgroud)

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

至于eval.call(pseudoGlobal, "x=12")eval.apply(pseudoGlobal, ["x=12"]),一些口译员不会允许它.

pan*_*-34 3

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

with (pseudoGlobal) eval("x=12")
Run Code Online (Sandbox Code Playgroud)

但不是为了创建财产。如果在当前执行上下文堆栈中找不到某个属性,则会在全局对象中创建该属性。这里的所有都是它的。你也可以尝试一些奇怪的事情:

//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];
}
Run Code Online (Sandbox Code Playgroud)

如果您关心全局绑定,请尝试:

var globalvars = {};
for (i in this)
    globalvars[i] = this[i];
with (globalvars) 
    eval("x=12")
Run Code Online (Sandbox Code Playgroud)

这样全局变量中的绑定就会改变。请注意,浅复制只会阻止一层的 bingings 更改。