JS Advanced

eval

Понять, что eval выполняет строку как JavaScript, почему это опасно, и какие альтернативы существуют.

Продвинутый (Advanced)

Кратко

eval(string) выполняет строку как JavaScript-код. Опасно: security risks (инъекции), performance (оптимизатор не может оптимизировать), debugging (ошибки не видны заранее). Альтернативы: JSON.parse, Function constructor, шаблонные строки.


Подробно

Что делает eval: eval('console.log("Hello")'); // выполняет строку

Доступ к переменным окружения: const x = 10; eval('x + 5'); // 15

Опасности:

  • Security: eval выполняет ЛЮБОЙ код

function unsafe(input) { eval(input); // input = 'document.cookie' → кража данных! }

  • Performance: JavaScript engine не может оптимизировать eval

// Обычный код: engine оптимизирует // eval: engine не знает что будет

  • Debugging: ошибки не видны заранее

// Обычный код: линтер видит ошибки // eval: ошибка только в runtime

  • Scope pollution:

function test() { eval('var x = 10;'); console.log(x); // 10 — x появился в scope! }

Альтернативы:

  • JSON.parse(json) — вместо eval('(' + json + ')')
  • new Function(args, body) — изолированный eval
  • Шаблонные строки — для динамических значений
  • switch/if — для динамической логики

Ментальная модель

eval — как открыть дверь настежь для незнакомца. Вы не знаете, что он принесёт (код). Может быть полезный подарок (динамический код), но обычно это взлом (security risk). Безопаснее — смотреть через окошко (JSON.parse) или звонить в дверь (new Function).


Примеры

**Самый простой:**

javascript
// eval — выполняет строку как код
eval('2 + 2'); // 4

// Но опасно:
const userInput = 'alert("hacked!")';
eval(userInput); // выполнит alert!

eval выполняет произвольный код из строки.

**Простой:**

javascript
// Альтернатива eval для JSON
const json = '{"name": "Анна", "age": 25}';

// ОПАСНО:
// const obj = eval('(' + json + ')');

// БЕЗОПАСНО:
const obj = JSON.parse(json);
console.log(obj.name); // 'Анна'

JSON.parse — безопасная альтернатива eval для JSON.

**Реальный пример:**

javascript
// new Function — более безопасная альтернатива
function createMultiplier(factor) {
  return new Function('x', `return x * ${factor}`);
}

const double = createMultiplier(2);
console.log(double(5)); // 10

// Важно: factor подставляется через строку,
// поэтому нужно санитизировать вход!
// new Function всё ещё опасен при user input.

new Function как более безопасная (но не полностью) альтернатива.


Частые ошибки

**Неправильно:** Использовать eval для парсинга JSON

**Почему:** eval выполняет ЛЮБОЙ код, не только JSON. Это уязвимость.

**Правильно:** Используйте JSON.parse() — он парсит ТОЛЬКО JSON.

**Неправильно:** Думать, что eval безопасен с локальной строкой

**Почему:** Даже локальная строка может содержать опасный код при динамическом формировании.

**Правильно:** eval опасен ВСЕГДА. Используйте безопасные альтернативы.


Важно запомнить

  • eval выполняет строку как JavaScript
  • Опасно: security, performance, debugging
  • Используйте JSON.parse вместо eval для JSON
  • new Function — более безопасная альтернатива
  • Избегайте eval в обычном коде

Связь

Назад: Вы знаете функции (J9) и типы (J3). eval — глобальная функция для динамического выполнения кода.

Вперёд: Следующий урок (JV22) — new Function — похожий, но немного иной механизм.

Материалы курса JS Advanced — PROlab Academy.