> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/a-core/a1-javascript-execution/08-eval-code.md).

# 08. Eval

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

```javascript
eval("3+2"); // => 5
```

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

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

```javascript
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:

```javascript
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.
