将 eval() 与自定义全局一起使用
Using eval() with a custom 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"])
,一些口译员不允许。
当然,您可以替换默认对象来分配属性值,例如
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 解释器,对脚本进行沙盒处理并返回一个包含所有已分配变量的对象。
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- 正在全局范围中查找JavaScript函数
- 转义符不能与innerHTML一起使用
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 全局对象是属于哪个类的对象
- Javascript全局onclick监听器
- 从Javascript方法返回全局变量
- 高亮显示与数组字符串一起使用时文本插件中断
- 访问jsrender模板中的全局javascript变量并更新它
- setTimeout可以与闭包内的函数一起使用吗
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- Highcharts colorsByPoint与系列中的线性渐变一起使用时不起作用
- 当与全局标志一起使用时,Javascript Regex在后续调用中返回null
- 我可以将全局变量与getElementById一起使用吗?
- 将 eval() 与自定义全局一起使用
- 如何将全局变量与 Phonegap Navigator.notification.conconfirm 一起使用
- Javascript, GruntJS,声明一个全局对象并将部分连接在一起
- Javascript变量不是全局返回/加在一起