Skip to main content

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:

  1. Створює нову функцію в глобальній області видимості (не в локальній!).
  2. Парсить рядок з тілом як звичайний JavaScript-код.
  3. Повертає об'єкт функції, готовий до виклику.

Важливо: 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

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.