Как выполнить "eval" для строки, содержащей функцию - PullRequest
0 голосов
/ 16 июня 2020

В следующем примере я ожидаю, что b и c = eval(a) будут содержать одну и ту же функцию, которая всегда возвращает true. Однако a не оценивается, скорее выдается синтаксическая ошибка: Uncaught SyntaxError: Function statements require a function name. Однако, если назвать функцию, c содержит undefined.

var a = "function() { return true }";

var b = function() { return true };

var c = eval(a);

console.log(b,c);

1 Ответ

2 голосов
/ 16 июня 2020

Проблема в том, что код, который вы вводите в eval, оценивается там, где ожидается оператор, но код, который у вас есть после var b =, оценивается как выражение. Когда синтаксический анализатор ожидает оператор, ключевое слово function запускает функцию объявление , для которой требуется имя. Но там, где ожидается выражение, ключевое слово function запускает функцию выражение , в которой имя не является обязательным.

Чтобы вместо этого eval работал с выражением, окружите код с ( и ):

var a = "function() { return true }";

var b = function() { return true };

var c = eval("(" + a + ")");
// −−−−−−−−−−^^^^^−−−^^^^^

console.log(b,c);

Предупреждение : будьте очень осторожны при использовании eval и по возможности избегайте его использования. Его цель - выполнить произвольный код из строк. Если вы его используете, вы должны верить, что источник этой строки заслуживает доверия. Никогда не принимайте пользовательский ввод от пользователя A, а затем eval в сеансе для пользователя B, если пользователь B не полностью осведомлен о том, что происходит (например, как в приведенном выше фрагменте стека - я пользователь A, вы пользователь B; предположительно, если вы нажмете кнопку «Выполнить», вы поймете, что код будет запущен). Фактически, имея дело с непрограммистами, даже не оценивайте код пользователя A в сеансе пользователя A. : -)

...