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