var stats = { a:1, b:2, c:3 };
with( stats )
{
console.log( eval( "(a+b)*2" ) );
};
问候,我希望能够仅在上述对象的范围内执行eval,但不使用with。我到处都看到它是一个禁止使用的主要禁忌:|
它只是一个例子,我们不知道eval中的表达式和对象。
答案 0 :(得分:5)
一种可能的方式:
keys = Object.keys;
values = function(obj) { return keys(obj).map(function(k) {
return obj[k]
})};
var stats = { a:1, b:2, c:3 };
expr = 'a+b*c'
fun = Function.apply(null, keys(stats).concat('return (' + expr + ')'))
result = fun.apply(null, values(stats))
console.log(result) // 7
与可重复使用的功能相同:
evalWith = function(context, expr) {
return Function.apply(
null, Object.keys(context).concat('return (' + expr + ')')
).apply(null, Object.keys(context).map(function(k) {
return context[k]
}));
}
var stats = { a:1, b:2, c:3 };
result = evalWith(stats, 'a+b*c');
使用eval
:
evalWith = function(context, expr) {
return eval(Object.keys(context).map(function(k) {
return "var " + k + "= context." + k;
}).concat(expr).join(";"));
}