Function
========

На самом деле каждая JavaScript-функция является объектом `Function`. Это легко проверить, выполнив проверку `(function(){}).constructor === Function`, которая вернёт true.

Конструктор
-----------

`Function()`

Создаёт новый объект `Function`. Вызов конструктора напрямую позволяет создавать функции программным путём. Такой способ представляет угрозу для безопасности, а также несёт разные (хотя не такие значительные) проблемы с производительностью при использовании с `Global_Objects/eval`. Однако в отличие от eval, конструктор `Function` создаёт функции, выполняемые только в глобальной области видимости.

Свойства экземпляра
-------------------

`Function.prototype.arguments`

 Массив с переданными функции аргументами.
 Это устаревшее свойство объекта `Function`. Вместо него используйте объект `arguments` (доступный внутри функции).


`Function.prototype.caller`

 Содержит функцию, которая вызвала текущую выполняющуюся функцию.
 Это устаревшее свойство, которое работает только в функциях без включённого строгого режима.


`Function.prototype.displayName`

Отображаемое имя функции.

`Function.prototype.length`

Содержит количество аргументов в функции.

`Function.prototype.name`

Имя функции.

Методы экземпляра
-----------------

`Function.prototype.apply(thisArg [, argsArray])`

Вызывает функцию и устанавливает её `this` на переданный `thisArg`. Аргументы могут быть переданы в виде объекта `Array`.

`Function.prototype.bind(thisArg[, arg1[, arg2[, ...argN]]])`

Создает новую функцию, при вызове которой её `this` будет установлен на `thisArg`. Можно также указать ряд аргументов, которые будут добавлены к аргументам при вызове новой привязанной функции.

`Function.prototype.call(thisArg[, arg1, arg2, ...argN])`

Вызывает функцию и устанавливает её `this` на переданное значение. Аргументы могут быть переданы как есть.

`Function.prototype.toString()`

 Возвращает строку с исходным кодом функции.
 Переопределяет метод `Object.prototype.toString`.


Примеры
-------

### Сравнение конструктора Function и объявления функции

Функции, созданные через конструктор `Function`, не имеют доступа к собственному контексту исполнения, т.е. они всегда создаются в глобальной области видимости. При выполнении таких функций, они смогут обращаться только к своим локальным и глобальным переменным, но не к переменным в той области видимости, в которой вызывался конструктор `Function`. В этом они отличаются от использования `Global_Objects/eval` с функциями-выражениями.


```js
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
```


Хотя этот код работает в браузерах, в окружении Node.js вызов `f1()` приведёт к ошибке `ReferenceError`, потому что `x` не будет найден. Это происходит из-за того, что область видимости верхнего уровня в Node не является глобальной областью видимости, поэтому `x` ссылается на локальную переменную в пределах текущего модуля.

Спецификации
------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-function-objects |

Совместимость с браузерами
--------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Смотрите также
--------------

* Функции и их область видимости
* Инструкция `function`
* Выражение `function`
* Инструкция `function*`
* Выражение `function*`
* `AsyncFunction`
* `GeneratorFunction`