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"]),一些口译员不会允许它.
当然,您可以替换默认对象来分配属性值,例如
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 更改。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |