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