有什么方法可以在特定范围内执行 eval()(但不是全球性的)?
例如,以下代码不起作用(第二条语句中 a 未定义),因为它们位于不同的范围内:
eval(var a = 1);
eval(alert(a));
如果可能的话,我想动态创建一个范围。例如(语法肯定是错误的,但只是为了说明这个想法)
var scope1;
var scope2;
with scope1{
eval(var a = 1); eval(alert(a)); // this will alert 1
}
with scope2{
eval(var a = 1); eval(a++); eval(alert(a)); // this will alert 2
}
with scope1{
eval(a += 2); eval(alert(a)); // this will alert 3 because a is already defined in scope1
}
关于如何实现这样的目标有什么想法吗?谢谢!
你可以使用“严格使用”将经过评估的代码包含在评估本身中。
Second, eval
严格模式代码不会将新变量引入周围范围。在普通代码中eval("var x;")
引入一个变量x
进入周围函数或全局范围。这意味着,一般来说,在包含调用的函数中eval
每个不引用参数或局部变量的名称都必须在运行时映射到特定的定义(因为eval
可能引入了一个新变量来隐藏外部变量)。严格模式下eval
仅为正在评估的代码创建变量,因此 eval 不会影响名称是否引用外部变量或某些局部变量
var x = 17; //a local variable
var evalX = eval("'use strict'; var x = 42; x"); //eval an x internally
assert(x === 17); //x is still 17 here
assert(evalX === 42); //evalX takes 42 from eval'ed x
如果一个函数声明为“use strict”,则其中的所有内容都将以严格模式执行。以下将执行与上面相同的操作:
function foo(){
"use strict";
var x = 17;
var evalX = eval("var x = 42; x");
assert(x === 17);
assert(evalX === 42);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)