Function
Конструктор Function
створює новий об'єкт Function
. Прямий виклик конструктора може створювати функції динамічно, але має проблеми з безпекою та схожі з eval
(але менш значні) проблеми з продуктивністю. Однак, на відміну від eval, конструктор Function створює функції, які виконуються тільки у глобальній області видимості.
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
- Імена, які будуть використані функцією в якості імен формальних аргументів. Кожне ім'я має бути рядком, який представляє ідентифікатор JavaScript, або списком таких рядків, розділених комою; наприклад, "
x
", "theValue
" або "a,b
". functionBody
- Рядок, що містить інструкції JavaScript, які складають визначення функції.
Опис
Об'єкти Function
, створені конструктором Function
, аналізуються, коли створюється функція. Це менш ефективно, ніж оголошувати функцію функціональним виразом або оголошенням функції та викликати її, бо такі функції аналізуються разом з рештою коду.
Усі аргументи, передані у функцію, сприймаються як імена ідентифікаторів параметрів функції, що має бути створена, в тому порядку, в якому вони передані.
Виклик конструктора Function
у вигляді функції (без оператора new
) має той самий ефект, що й виклик конструктора.
Властивості та методи об'єкта Function
Глобальний об'єкт Function
не має власних методів та властивостей, однак, він успадковує деякі методи та властивості через ланцюжок прототипів від Function.prototype
.
Об'єкт прототипу Function
Властивості
Function.prototype.arguments
- Масив, що відповідає аргументам, переданим у функцію. Це застаріла властивість
Function
. Використовуйте натомість об'єктarguments
, доступний всередині функції. Function.arity
Вказувала кількість аргументів, очікуваних функцією, але була видалена. Використовуйте натомість властивістьlength
.Function.prototype.caller
- Вказує функцію, що викликала функцію, яка виконується.
Function.prototype.length
- Вказує кількість аргументів, очікуваних функцією.
Function.prototype.name
- Ім'я функції.
Function.displayName
- Ім'я, що відображається для функції.
Function.prototype.constructor
- Вказує функцію, яка створює прототип об'єкта. Більше інформації дивіться на сторінці
Object.prototype.constructor
.
Методи
Function.prototype.apply()
- Викликає функцію та встановлює її this надане значення, аргументи можуть передаватися об'єктом
Array
. Function.prototype.bind()
- Створює нову функцію, в якої під час виклику this присвоєне надане значення, з заданою послідовністю аргументів, що передують будь-якім іншим наданим аргументам під час виклику нової функції.
Function.prototype.call()
- Викликає (виконує) функцію та присвоює її this надане значення, аргументи можуть передаватися як є.
Function.prototype.isGenerator()
- Повертає
true
, якщо функція є генератором; інакше повертаєfalse
. Function.prototype.toSource()
- Повертає рядкове представлення першокоду функції. Заміщує метод
Object.prototype.toSource
. Function.prototype.toString()
- Повертає рядкове представлення першокоду функції. Заміщує метод
Object.prototype.toString
.
Екземпляри Function
Екземпляри Function
успадковують методи та властивості від 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 та оголошенням функції
Функції, створені конструктором Function
, не утворюють замикань з контекстом свого cтворення; вони завжди cтворюються у глобальній області видимості. Під час виконання вони матимуть доступ лише до власних локальних змінних та глобальних змінних, а не до змінних з області видимості, де був створений конструктор Function
. Це відрізняється від 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
буде локальною змінною модуля.
Специфікації
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Початкове визначення. Реалізоване у JavaScript 1.0. |
ECMAScript 5.1 (ECMA-262) The definition of 'Function' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Function' in that specification. |
Standard | |
ECMAScript (ECMA-262) The definition of 'Function' in that specification. |
Living Standard |
Сумісність з веб-переглядачами
BCD tables only load in the browser