Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Function Constructor». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Function Constructor** - це спеціальний спосіб створення функцій "на льоту" з рядків, який дозволяє динамічно створювати новий об'єкт `Function` із заданими параметрами і тілом функції. **Ключове:** функції, створені через `new Function`, завжди виконуються в глобальній області видимості і не мають доступу до зовнішніх (лексичних) змінних.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що це таке `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`) | | Продуктивність | Повільний, оскільки парсить код під час виконання | | Замикання | Не підтримує | | Застосування | Динамічне створення обчислюваних функцій |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.