• Авторизация


Проблема с eval() 15-09-2006 09:53 к комментариям - к полной версии - понравилось!


Разрабатываю сейчас обработку ошибок для InfoPath.
Соответственно родилась и реализация обёртки javascript функции eval():
function Eval(strForEvalute)
{
 try
 {
  return eval(strForEvalute);
 }
 catch(e)
 {
  throw new EvalutionException(e);
 }
}
в тесте пытался выполнить встраивание определения переменных с помощью
Eval("var some = 5" ) - 
переменная some после выполнения eval - undefined... Что такое?
Что ж, RTFM!
Полез в доку - и в первой же строчке посвящённой eval читаю: "Функция eval выполняет строку-аргумент и подставлает полученное значение вместо себя."
"вместо себя" - это выходит, что моя some всё-таки не undefined, а просто она определена в качестве private внутри Eval()
И что теперь делать?
Отказаться от обёртки?
PS. приведённый пример "var some = 5" - только для упрощения понимания, реальная задача намного сложнее.
вверх^ к полной версии понравилось! в evernote
Комментарии (1):
Skaz 30-10-2006-15:23 удалить
Это было словно озарение :-) ведь не с простой функцией дело имею - с eval'oм! А ему можно что угодно в текстовом виде "скормить"! Короче говоря - применив модификацию шаблона "Декоратор" (обёртка необходимым текстом) удалось решить эту проблему:
function DecorateInstructionsForEvalution(strForEvalute)
{
	return "try {" + strForEvalute + "}catch(e){throw new EvalutionException(e);}";
}
Ну и тесты (для системы JSUnit):
function testDecorateInstructionsForEvalution()
{
	eval(DecorateInstructionsForEvalution("var some = 5;"));
	assertNotUndefined(some);
	assertEquals(5, some);
}

function testDecorateInstructionsForEvalution_ReturnedValue()
{
	var variable = DecorateInstructionsForEvalution("function some_f(arg){return arg} some_f(5);");
	assertEquals(5, eval(variable));
	assertEquals(7, some_f(7));
}


Комментарии (1): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Проблема с eval() | Skaz - Дневник бредущего краем неба | Лента друзей Skaz / Полная версия Добавить в друзья Страницы: раньше»