2010-12-05 52 views
2

如何执行一个字符串作为代码(使用eval())并给它一些变量?例如,我有一个名为vars的对象,并希望它的每个属性都可以在代码中进行访问,而无需指定对象名称。事情是这样的:eval()与范围内的对象的变量

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()的代码看起来不错,很简短,并且不需要包含帮助变量名等等。

回答

3

发现,它可能只使用with

eval("with (vars) {var result = (" + func + ")}"); 
1

您可以重构为JavaScript代码的值并在其之前加上要执行的代码。然后,将实际表达式的结果分配给一个局部变量。所以,

evalWithVariables("a>5", {"a":7}); 

实际上eval S:

var a=7; var result = (a>5); 

然后,eval之后,检查result值:

function evalWithVariables(func, vars) { 
var varString = ""; 

for (var i in vars) 
    varString += "var " + i + " = " + vars[i] + ";"; 

eval(varString + "; var result = (" + func + ")"); 
return result; 
} 
+0

嗯,是的,应该工作,但它不知何故看起来不干净。 – thejh 2010-12-05 16:09:31

+1

概念本身是不洁的:) – 2010-12-05 17:54:54

0

也许你使用一个功能更强大的方法:

function evalWithVariables(func, vars) { 
    return func(vars); 
} 
evalWithVariables(function(vars) { return vars.a > 5; }, {"a":7}) 

或更短:

(function(vars) { return vars.a > 5; })({"a":7}) 
+0

不,我真的从XML节点属性加载JS代码。 – thejh 2010-12-08 14:15:06

1

放弃eval()是生成一个函数,然后用with(),像你一样,要改变一个选项块范围:

function evalWithVariables(func, vars) { 
    return new Function("v", "with (v) { return (" + func +")}")(vars); 
}