Как часть моего механизма шаблонов, я должен уметь оценивать выражения в JavaScript, например: "first || second"
в контексте некоторого объекта, выполняющего роль глобального пространства имен.Таким образом, свойства объекта должны рассматриваться как глобальные переменные.
До сих пор я придумал эту функцию:
function scopedEval(str, scope) {
var f = new Function("scope", "with(scope) { return (" + str + "); }");
return f(scope);
}
Все в порядке, и я могу запустить его как:
var scope = { first:1, second:2 };
var expr1 = "first || second";
alert( scopedEval(expr1,scope) );
это предупреждает меня 1
.
Единственная проблема с переменными, которые не были определены в объекте области.Это:
var expr2 = "third || first || second";
alert( scopedEval(expr2,scope) );
генерирует ошибку «переменная third
не определена».Но я бы хотел, чтобы все неизвестные переменные были разрешены в undefined
, а не выдавали ошибки.Таким образом, «третий || первый || второй» должен снова дать 1
.
Насколько мне известно, в современном JavaScript такое невозможно, но я мог бы пропустить что-то такое, спрашивающее.Есть идеи?
Вот пример для игры: http://jsfiddle.net/nCCgT/