Проблема в том, что код, который вы вводите в 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. : -)