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

Using eval() with a custom global

本文关键字:全局 一起 自定义 eval      更新时间:2023-09-26

有没有办法指定在调用eval()时将哪个对象用于全局

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

这是行不通的,但这说明了我想要的:

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

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

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

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

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")

这样,绑定将在全局变量中更改。请注意,浅拷贝只会阻止一个级别的暴饮更改。

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

我想

到了两种解决方案:

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