--- title: Function slug: Web/JavaScript/Reference/Global_Objects/Function tags: - Constructor - Function - JavaScript translation_of: Web/JavaScript/Reference/Global_Objects/Function ---
Конструктор Function
створює новий об'єкт Function
. Прямий виклик конструктора може створювати функції динамічно, але має проблеми з безпекою та схожі з {{jsxref("eval")}} (але менш значні) проблеми з продуктивністю. Однак, на відміну від eval, конструктор Function створює функції, які виконуються тільки у глобальній області видимості.
{{EmbedInteractiveExample("pages/js/function-constructor.html")}}
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
У JavaScript кожна функція є об'єктом Function
. Це можна побачити за допомогою коду (function(){}).constructor === Function
, який повертає true.
new Function ([arg1[, arg2[, ...argN]],] functionBody)
arg1, arg2, ... argN
x
", "theValue
" або "a,b
".functionBody
Об'єкти Function
, створені конструктором Function
, аналізуються, коли створюється функція. Це менш ефективно, ніж оголошувати функцію функціональним виразом або оголошенням функції та викликати її, бо такі функції аналізуються разом з рештою коду.
Усі аргументи, передані у функцію, сприймаються як імена ідентифікаторів параметрів функції, що має бути створена, в тому порядку, в якому вони передані.
Виклик конструктора Function
у вигляді функції (без оператора new
) має той самий ефект, що й виклик конструктора.
Function
Глобальний об'єкт Function
не має власних методів та властивостей, однак, він успадковує деякі методи та властивості через ланцюжок прототипів від {{jsxref("Function.prototype")}}.
Function
Function
Екземпляри Function
успадковують методи та властивості від {{jsxref("Function.prototype")}}. Як і в усіх конструкторах, ви можете змінити об'єкт прототипу конструктора, щоб внести зміни до усіх екземплярів Function
.
Function
Наступний код створює об'єкт Function
, що приймає два аргументи.
// Цей приклад можна запустити прямо у консолі JavaScript // Створити функцію, що приймає два аргументи та повертає суму цих аргументів var adder = new Function('a', 'b', 'return a + b'); // Виклик функції adder(2, 6); // > 8
Аргументи "a
" та "b
" є іменами формальних аргументів, які використовуються у тілі функції, "return a + b
".
Функції, створені конструктором Function
, не утворюють замикань з контекстом свого cтворення; вони завжди cтворюються у глобальній області видимості. Під час виконання вони матимуть доступ лише до власних локальних змінних та глобальних змінних, а не до змінних з області видимості, де був створений конструктор Function
. Це відрізняється від {{jsxref("eval")}} з кодом функціонального виразу.
var x = 10; function createFunction1() { var x = 20; return new Function('return x;'); // цей |x| звертається до глобального |x| } function createFunction2() { var x = 20; function f() { return x; // цей |x| звертається до локального |x|, записаного вище } return f; } var f1 = createFunction1(); console.log(f1()); // 10 var f2 = createFunction2(); console.log(f2()); // 20
В той час, як цей код працює у веб-переглядачах, f1()
спричинить ReferenceError
у Node.js, через те, що x
не буде знайдено. Це відбувається тому, що область видимості верхнього рівня у Node не є глобальною областю видимості, і x
буде локальною змінною модуля.
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Початкове визначення. Реалізоване у JavaScript 1.0. |
{{SpecName('ES5.1', '#sec-15.3', 'Function')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-function-objects', 'Function')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-function-objects', 'Function')}} | {{Spec2('ESDraft')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.builtins.Function")}}