Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

В JS функция - это объект. Как форма записи ф-ии коррелируется с синтаксисом записи объектного литерала?

return x в ф-ии, например

JavascriptФункцииПомощь с программированием
  · 1,2 K
Лучший
старший разработчик в pseven.io  · 30 мая 2021

Объектный литерал в JS — это не исчерпывающее описание объекта, это просто один из способов создать новый объект. Не любой объект можно создать через объектный литерал. Функции как раз являются таким исключением.

Рассмотрим подробнее, что такое функция. Это действительно объект, имеющий прототип Function, который в свою очередь имеет своим прототипом Object.

image.png

Но кроме конструктора, прототипа и свойств при создании функции также указывается её тело, представленное в памяти в виде кода, хранящегося по некоему адресу:

image.png

В предыдущих версиях JS телом функции действительно являлся обычный JavaScript-код. У объекта или функции можно было вызвать метод toSource(), чтобы получить их исходный код в виде текста. Но это уже давно не так, сейчас тот же V8 компилирует скрипты перед исполнением, плюс к этому есть встроенные функции типа методов массива, так что телом функции сейчас может быть нативный код. Это одна из причин, почему функцию нельзя описать в виде объектного литерала.

Поправка — у функции всё ещё можно вызвать метод toString() и получить её исходный код или строку [native code]. Но это работает в одну сторону — нет способа задать или поменять код функции через какой-либо метод.

При этом функции являются объектами в полном смысле — с ними можно работать как с объектами, они имеют свои поля и методы, позволяют добавлять новые через присваивание. Но через присваивание полей нельзя поменять тело (код) функции. Также в JS нельзя превратить объект в функцию, поменяв его прототип. Иными словами, всё, что можно делать с объектами, можно делать с функциями, но не всё, что можно делать с функциями, можно делать с объектами.

Несмотря на то, что функции являются объектами, они имеют свой особый тип:

image.png

Стоит добавить, что ничто не мешает указать функцию внутри объектного литерала, описав таким образом его метод. По сути метод в JS-объекте — это и есть поле типа "функция":

image.png

Интересный факт — теоретически функцию можно создать, инстанцировав Function и передав ему тело в качестве аргумента. Это конечно не создание через объектный литерал, но по сути близко к нему:

image.png

Однако большинство современных браузеров запрещают такое поведение в целях безопасности. То есть, вторая причина, по которой нельзя создать функцию через литерал — это безопасность. Данные, приходящие с сервера, должны интерпретироваться как данные, и не должны по ошибке или в результате действий злоумышленника превращаться в исполняемый код.

Что-то осталось непонятно? Спроси в нашей группе в Телеграме!Перейти на t.me/jstsmentor
Функция является прототипом объекта и функция имеет прототипом объект. В то же время функция имеет прототип conctru... Читать дальше
software engineer Увлекаюсь решением алгоритмических задач, игрой на гитаре и сборкой...  · 20 мая 2021

Никак не коррелируется, функция является объектом по типу данных в языке программирования javaScript, то есть хранится также, как объект в памяти, не смотря на то, что записывается по другому. Более того есть языки программирования, такие как ruby в которых все типы являются объектами, в том числе строки и числа

Т.е. просто зависит от объема занимаемой памяти?Хотя вроде и нет.Просто принять это как данность. Понял,спасибо.