0
var stats = { a:1, b:2, c:3 };
with( stats )
{
    console.log( eval( "(a+b)*2" ) );
};

问候,我希望能够仅在上述对象的范围内执行评估,但不使用 with。我到处都看到它是一个主要的禁忌:|

它只是一个示例,我们不知道 eval 和对象中的表达式是什么。

4

1 回答 1

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(";"));
}
于 2013-10-05T10:59:31.897 回答