Сводка
Конструктор Function создаёт новый объект Function. В JavaScript каждая функция является объектом Function.
Синтаксис
new Function([arg1[, arg2[, ...argN]],] functionBody)
Параметры
-
arg1, arg2, ... argN -
Имена, используемые функцией в качестве имён формальных аргументов. Каждое имя должно быть строкой, представляющий допустимый идентификатор JavaScript, либо списком таких строк, разделённых запятой; например "
x", "theValue" или "a,b". -
functionBody - Строка, содержащая инструкции JavaScript, составляющие определение функции.
Описание
Объекты Function, созданные констуктором Function, разбираются при создании функции. Это менее эффективно определения и вызова функции внутри вашего кода, поскольку функции, объявленные с инструкцией function, разбираются вместе с остальным кодом.
Все аргументы, переданные в функцию, трактуются как имена идентификаторов параметров создаваемой функции, и имеют тот же порядок следования, что и при их передаче в конструктор функции.
Примечание: функции, созданные конструктором Function, не создают замыканий на их контексты создания; они всегда создаются в глобальной области видимости. При их вызове, они получат доступ только к своим локальным переменным и переменным из глобальной области видимости, но не к переменным в той области видимости, в которой вызывался конструктор Function. Это поведение отличается от поведения при использовании функции eval с кодом создания функции.
Вызов констуктора Function как функции (без использования оператора new) имеет тот же самый эффект, что и вызов его как констуктора.
Свойства и методы объекта Function
Глобальный объект Function не имеет собственных методов или свойств, однако, поскольку он сам является функцией, он наследует некоторые методы и свойства через цепочку прототипов объекта Function.prototype.
Прототип объекта Function
Свойства
-
Function.arguments -
An array corresponding to the arguments passed to a function. This is deprecated as property of
Function, use theargumentsobject available within the function instead. -
Function.arity -
Used to specifiy the number of arguments expected by the function, but has been removed. Use thelengthproperty instead. -
Function.caller - Specifies the function that invoked the currently executing function.
-
Function.length - Specifies the number of arguments expected by the function.
-
Function.name - The name of the function.
-
Function.displayName - The display name of the function.
-
Function.prototype.constructor -
Specifies the function that creates an object's prototype. See
Object.prototype.constructorfor more details.
Методы
-
Function.prototype.apply() -
Applies the method of another object in the context of a different object (the calling object); arguments can be passed as an
Arrayobject. -
Function.prototype.bind() - Creates a new function which, when called, itself calls this function in the context of the provided value, with a given sequence of arguments preceding any provided when the new function was called.
-
Function.prototype.call() - Calls (executes) a method of another object in the context of a different object (the calling object); arguments can be passed as they are.
-
Function.prototype.isGenerator() -
Returns
trueif the function is a generator; otherwise returnsfalse. -
Function.prototype.toSource() -
Returns a string representing the source code of the function. Overrides the
Object.prototype.toSourcemethod. -
Function.prototype.toString() -
Returns a string representing the source code of the function. Overrides the
Object.prototype.toStringmethod.
Экземпляры объекта 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".
Пример: рекурсивное сокращение для массового изменения DOM
Создание функции через конструктор Function - это один из способов динамического создания из функции неизвестного количества новых объектов с некоторым выполняемым кодом в глобальной области видимости. Следующий пример (a рекурсивное сокращение для массового изменения DOM) был бы невозможен без вызова конструктора Function для каждого нового запроса, если вы хотите избежать использования замыканий.
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Пример MDN - рекурсивное сокращение для массового изменения DOM</title>
<script type="text/javascript">
var domQuery = (function() {
var aDOMFunc = [
Element.prototype.removeAttribute,
Element.prototype.setAttribute,
CSSStyleDeclaration.prototype.removeProperty,
CSSStyleDeclaration.prototype.setProperty
];
function setSomething(bStyle, sProp, sVal) {
var bSet = Boolean(sVal), fAction = /old?u=https%3A%2F%2Fdeveloper.mozilla.org%2Fru%2Fdocs%2FWeb%2FJavaScript%2FReference%2FGlobal_Objects%2FaDOMFunc%5BbSet&y=1999 | bStyle << 1],
aArgs = Array.prototype.slice.call(arguments, 1, bSet ? 3 : 2),
aNodeList = bStyle ? this.cssNodes : this.nodes;
if (bSet && bStyle) { aArgs.push(''); }
for (
var nItem = 0, nLen = this.nodes.length;
nItem < nLen;
fAction.apply(aNodeList[nItem++], aArgs)
);
this.follow = setSomething.caller;
return this;
}
function setStyles(sProp, sVal) { return setSomething.call(this, true, sProp, sVal); }
function setAttribs(sProp, sVal) { return setSomething.call(this, false, sProp, sVal); }
function getSelectors() { return this.selectors; };
function getNodes() { return this.nodes; };
return (function(sSelectors) {
var oQuery = new Function('return arguments.callee.follow.apply(arguments.callee, arguments);');
oQuery.selectors = sSelectors;
oQuery.nodes = document.querySelectorAll(sSelectors);
oQuery.cssNodes = Array.prototype.map.call(oQuery.nodes, function(oInlineCSS) { return oInlineCSS.style; });
oQuery.attributes = setAttribs;
oQuery.inlineStyle = setStyles;
oQuery.follow = getNodes;
oQuery.toString = getSelectors;
oQuery.valueOf = getNodes;
return oQuery;
});
})();
</script>
</head>
<body>
<div class="testClass">Lorem ipsum</div>
<p>Некоторый текст</p>
<div class="testClass">dolor sit amet</div>
<script type="text/javascript">
domQuery('.testClass')
.attributes('lang', 'en')('title', 'Risus abundat in ore stultorum')
.inlineStyle('background-color', 'black')('color', 'white')('width', '100px')('height', '50px');
</script>
</body>
</html>
Спецификации
| Спецификация | Статус | Комментарии |
|---|---|---|
| ECMAScript 1-е издание. | Стандарт | Изначальное определение. Реализована в JavaScript 1.0. |
| ECMAScript 5.1 (ECMA-262) Определение 'Function' в этой спецификации. |
Стандарт | |
| ECMAScript 6 (ECMA-262) Определение 'Function' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) |
| Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |