eval () с переменными из объекта в области видимости - PullRequest
2 голосов
/ 05 декабря 2010

как я могу выполнить строку как код (используя 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(), выглядит хорошо, короток и не должен содержать имена вспомогательных переменных или около того.

Ответы [ 4 ]

4 голосов
/ 10 декабря 2010

Обнаружено, что можно просто использовать with:

eval("with (vars) {var result = (" + func + ")}");
1 голос
/ 11 декабря 2010

Можно отказаться от eval(), чтобы сгенерировать функцию и затем использовать with(), как вы это сделали, чтобы изменить область действия блока:

function evalWithVariables(func, vars) {
    return new Function("v", "with (v) { return (" + func +")}")(vars);
}
1 голос
/ 05 декабря 2010

Вы можете восстановить значения как код JavaScript и добавить к нему код, который будет выполнен.Затем присвойте результат фактического выражения локальной переменной.Итак,

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

на самом деле eval с:

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 голосов
/ 05 декабря 2010

Возможно, вы используете более функциональный подход:

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

Или короче:

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