> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/c-functions/c1-functions/04-functions-as-objects.md).

# 04. Functions as Objects

Функции в JS являются специальной разновидностью объектов, с которым связан выполняемый код. Хоть для функции `typeof` вернет значение `"function"`, обращаться и взаимодействовать с функциями можно как с объектами.

Каждая функция является экземпляром класса `Function` и наследует свойства от `Function.prototype`, который в свою очередь наследует от `Object.prototype`.

```javascript
const f = () => {};
Object.prototype.isPrototypeOf(f); // true
```

Свойства функции:

* `caller` - вернет объект, вызвавший данную функцию.
* `length` - число объявленных параметров функции.
* `name` - возвращает имя функции
* `constructor` - как обычно ссылка на функцию-конструктор.
* Каждая функция создается с дополнительными скрытыми свойствами - *контекстом вызова* `[[Scope]]` функции и *кодом* `[[Source]]` функции.

Методы:

* `apply`/`bind`/`call` -- косвенный вызов функции
* `toString` -- возвращает исходный код функции в виде форматированной строки (ES2018).
  * Исходный код, если это возможно;
  * В противном случае - стандартная вставка (`"function FunctionName() { [native code] }"`).
