Function

Конструктор Function створює новий об'єкт Function. Прямий виклик конструктора може створювати функції динамічно, але має проблеми з безпекою та схожі з eval (але менш значні) проблеми з продуктивністю. Однак, на відміну від eval, конструктор Function створює функції, які виконуються тільки у глобальній області видимості.

У 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 This deprecated API should no longer be used, but will probably still work.
Масив, що відповідає аргументам, переданим у функцію. Це застаріла властивість Function. Використовуйте натомість об'єкт arguments, доступний всередині функції.
Function.arity This is an obsolete API and is no longer guaranteed to work.
Вказувала кількість аргументів, очікуваних функцією, але була видалена. Використовуйте натомість властивість length.
Function.prototype.caller This API has not been standardized.
Вказує функцію, що викликала функцію, яка виконується.
Function.prototype.length
Вказує кількість аргументів, очікуваних функцією.
Function.prototype.name
Ім'я функції.
Function.displayName This API has not been standardized.
Ім'я, що відображається для функції.
Function.prototype.constructor
Вказує функцію, яка створює прототип об'єкта. Більше інформації дивіться на сторінці Object.prototype.constructor.

Методи

Function.prototype.apply()
Викликає функцію та встановлює її this надане значення, аргументи можуть передаватися об'єктом Array.
Function.prototype.bind()
Створює нову функцію, в якої під час виклику this присвоєне надане значення, з заданою послідовністю аргументів, що передують будь-якім іншим наданим аргументам під час виклику нової функції.
Function.prototype.call()
Викликає (виконує) функцію та присвоює її this надане значення, аргументи можуть передаватися як є.
Function.prototype.isGenerator() This API has not been standardized.
Повертає true, якщо функція є генератором; інакше повертає false.
Function.prototype.toSource() This API has not been standardized.
Повертає рядкове представлення першокоду функції. Заміщує метод 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

Див. також