Function Constructor
Що це таке
Function Constructor - це спеціальний спосіб створення функцій "на льоту" з рядків.
Він дозволяє динамічно створювати новий об'єкт Function із заданими параметрами і тілом функції.
Синтаксис:
javascript
new Function ([arg1, arg2, ...argN], functionBody)arg1...argN- імена параметрів функції (рядки)functionBody- рядок з кодом тіла функції
Приклади використання
Приклад 1: найпростіша функція
javascript
const sum = new Function('a', 'b', 'return a + b;');
console.log(sum(2, 3)); // 5Це еквівалентно:
javascript
function sum(a, b) {
return a + b;
}але створюється під час виконання.
Приклад 2: створення функції з рядка
javascript
const expr = 'return x * 2;';
const double = new Function('x', expr);
console.log(double(5)); // 10Функція формується динамічно, ніби інтерпретується як новий JS-код.
Як це працює "під капотом"
Коли ти викликаєш new Function(...), рушій JavaScript:
- Створює нову функцію в глобальній області видимості (не в локальній!).
- Парсить рядок з тілом як звичайний JavaScript-код.
- Повертає об'єкт функції, готовий до виклику.
Важливо: new Function не має доступу до зовнішніх змінних
Помилка:
javascript
let x = 10;
const fn = new Function('return x;');
console.log(fn()); // ReferenceError: x is not definedПояснення:
Функції, створені через new Function, завжди виконуються в глобальній області,
тому вони не "бачать" лексичні змінні із замикань.
Приклад правильного використання
Можна використовувати, якщо потрібно виконати динамічно складений код:
javascript
const operation = '+';
const makeOp = new Function('a', 'b', `return a ${operation} b;`);
console.log(makeOp(10, 5)); // 15Чому краще не зловживати
new Function фактично працює як eval():
- виконує рядок як JavaScript-код;
- небезпечний (якщо рядок приходить ззовні);
- повільніший, тому що вимагає парсингу і компіляції під час виконання;
- втрачає контекст і замикання.
Коли може бути корисним
| Сценарій | Навіщо використовувати |
|---|---|
| Генерація функцій "на льоту" | Коли тіло функції заздалегідь невідоме |
| Інтерпретатор, шаблонізатор, DSL | Наприклад, обробка користувацьких виразів |
| Тестування похідних виразів | Швидке створення обчислюваних функцій |
Підсумок
| Особливість | Опис |
|---|---|
| Створює функцію з рядка | Так |
| Область видимості | Глобальна, без доступу до зовнішніх змінних |
| Безпека | Потенційно небезпечний (як eval) |
| Продуктивність | Повільний, оскільки парсить код під час виконання |
| Замикання | Не підтримує |
| Застосування | Динамічне створення обчислюваних функцій |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.