eval в JavaScript с отложенным выполнением:
Возвращать именно функцию может быть полезно, если выражение в eval завязано на какую-то внешнюю переменную. Например, в str_to_eval у нас условие: "Param1 > 10". Понятно, что его надо выполнить в момент проверки, а не инициализации. Поэтому выполнение в примере отложено.
Для eval выполняется правило последней строки, пришедшее в Ruby и R из Fortran - eval возвращает значение, которое вернула последняя выполненная строка переданного ему выражения. Это может быть в т.ч. строка с числом:
или даже со строковой константой:
Как вариант, можно отказаться от ошибок и понимать "неправильный" JavaScript как строковую константу:
var JsEvaluator = (function(){ var errors = { WRONG_SYNTAX : "Синтаксическая ошибка в выражении \"%SOURCE%\"", NON_SYNTAX : "Ошибка %ERROR_TITLE% при разборе выражения \"%SOURCE%\"" }; function null_func() { return null; } return { checkedEval : function(str_to_eval){ if(!str_to_eval) return null_func; var trimmed_str = str_to_eval.trim(); if(!trimmed_str) return null_func; try { var result = eval(trimmed_str); if(result === undefined) return null_func; } catch(e) { var error_text = (!(e instanceof SyntaxError)) ? errors.WRONG_SYNTAX.replace(/%SOURCE%/, trimmed_str) : errors.NON_SYNTAX.replace(/%ERROR_TITLE%/, e.name).replace(/%SOURCE%/, trimmed_str); console.error(error_text); return null_func; } return function() { return eval(trimmed_str); }; } }; })();
Возвращать именно функцию может быть полезно, если выражение в eval завязано на какую-то внешнюю переменную. Например, в str_to_eval у нас условие: "Param1 > 10". Понятно, что его надо выполнить в момент проверки, а не инициализации. Поэтому выполнение в примере отложено.
Для eval выполняется правило последней строки, пришедшее в Ruby и R из Fortran - eval возвращает значение, которое вернула последняя выполненная строка переданного ему выражения. Это может быть в т.ч. строка с числом:
eval("1;2;4") > 4
или даже со строковой константой:
eval("'boo'") > "boo"
Как вариант, можно отказаться от ошибок и понимать "неправильный" JavaScript как строковую константу:
var JsEvaluator = (function(){ function null_func() { return null; } return { checkedEval : function(str_to_eval){ if(!str_to_eval) return null_func; var trimmed_str = str_to_eval.trim(); if(!trimmed_str) return null_func; try { var result = eval(trimmed_str); if(result === undefined) return null_func; } catch(e) { return function() { return str_to_eval; }; } return function() { return eval(trimmed_str); }; } }; })();
Комментариев нет:
Отправить комментарий