08. Eval

JS имеет встроенную функцию eval(code), которая позволяет выполнить код, переданный ей в виде строки.

eval("3+2"); // => 5
  • Код внутри eval() выполнен в текущей области видимости.

  • Вызов eval() возвращает последнее вычисленное выражение.

  • При вызове eval имеет полный доступ к локальным переменным.

  • В строгом режиме eval() имеет свою область видимости. Код внутри eval() по-прежнему сможет читать и менять внешние переменные, однако переменные и функции, объявленные внутри eval(), не попадут наружу.

Если выполняемый код всё же должен взаимодействовать с локальными переменными – используйте new Function('a,b', '..body..'). Создавайте функцию из строки и передавайте переменные ей, это надёжно и безопасно.

const a = 2,
  b = 3;

// вместо обращения к a,b через eval
// будем принимать их как аргументы динамически созданной функции
const mul = new Function("a, b", " return a * b;");
mul(a, b); // 6

В современном JS нет ни одной причины использовать eval():

  • Код внутри eval() не может быть оптимизирован заранее;

  • Код внутри eval() не может быть минимифицирован.

The eval() function isn’t the only way to execute a JavaScript string from within JavaScript. The same can be done using the Function constructor as well as setTimeout() and setInterval(). Here are some examples:

var myfunc = new Function("alert('Hi!')");
setTimeout("document.body.style.background='red'", 50);
setInterval("document.title = 'It is now '" + new Date(), 1000);

All of these are considered bad practice by most of the JavaScript community. Although eval() may be used from time to time in JavaScript libraries (mostly in relation to JSON), the other three uses are rarely, if ever, used. A good general guideline is to never use Function and to use eval() only if no other options are present. Both setTimeout() and setInterval() can be used but should use function instead of strings.

Last updated