Кратко
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).
Примеры
**Самый простой:**
// eval — выполняет строку как код
eval('2 + 2'); // 4
// Но опасно:
const userInput = 'alert("hacked!")';
eval(userInput); // выполнит alert!eval выполняет произвольный код из строки.
**Простой:**
// Альтернатива eval для JSON
const json = '{"name": "Анна", "age": 25}';
// ОПАСНО:
// const obj = eval('(' + json + ')');
// БЕЗОПАСНО:
const obj = JSON.parse(json);
console.log(obj.name); // 'Анна'JSON.parse — безопасная альтернатива eval для JSON.
**Реальный пример:**
// 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 — похожий, но немного иной механизм.