Javascript eval(),其中包含作用域中某个对象的变量
如何将字符串作为代码执行(使用Javascript eval(),其中包含作用域中某个对象的变量,javascript,eval,Javascript,Eval,如何将字符串作为代码执行(使用eval())并给它一些变量?例如,我有一个名为vars的对象,并且希望它的每个属性都可以被代码访问,而不必指定对象名称。大概是这样的: function evalWithVariables(func, vars) { //some magic here return eval(func); } function test() { var retval = evalWithVariables("a>5", {"a":7}); console.log(
eval()
)并给它一些变量?例如,我有一个名为vars
的对象,并且希望它的每个属性都可以被代码访问,而不必指定对象名称。大概是这样的:
function evalWithVariables(func, vars) {
//some magic here
return eval(func);
}
function test() {
var retval = evalWithVariables("a>5", {"a":7});
console.log(retval);
}
哦,代码是可信的,它与脚本来自同一个服务器,它不是用户生成的,我非常确定eval
是正确的工具(我知道eval
通常是邪恶的)
编辑:对我来说,最重要的是传递给
eval()
的代码看起来很好,很短,不必包含帮助变量名等等。您可以将这些值重新构造为JavaScript代码,并将其作为要执行的代码的前缀。然后,将实际表达式的结果赋给局部变量。所以
evalWithVariables("a>5", {"a":7});
实际上eval
s:
var a=7; var result = (a>5);
然后,在eval
之后,检查结果的值
:
function evalWithVariables(func, vars) {
var varString = "";
for (var i in vars)
varString += "var " + i + " = " + vars[i] + ";";
eval(varString + "; var result = (" + func + ")");
return result;
}
也许您可以使用更实用的方法:
function evalWithVariables(func, vars) {
return func(vars);
}
evalWithVariables(function(vars) { return vars.a > 5; }, {"a":7})
或更短:
(function(vars) { return vars.a > 5; })({"a":7})
发现可以将
与
一起使用:
eval("with (vars) {var result = (" + func + ")}");
放弃
eval()
的一个选项是生成一个函数,然后使用with()
,就像您所做的那样,更改块范围:
function evalWithVariables(func, vars) {
return new Function("v", "with (v) { return (" + func +")}")(vars);
}
这个概念本身是不干净的:)这不是比我的解决方案更复杂、更慢吗?请注意,严格模式下不允许使用with()