Объектный литерал в JS — это не исчерпывающее описание объекта, это просто один из способов создать новый объект. Не любой объект можно создать через объектный литерал. Функции как раз являются таким исключением.
Рассмотрим подробнее, что такое функция. Это действительно объект, имеющий прототип Function, который в свою очередь имеет своим прототипом Object.
Но кроме конструктора, прототипа и свойств при создании функции также указывается её тело, представленное в памяти в виде кода, хранящегося по некоему адресу:
В предыдущих версиях JS телом функции действительно являлся обычный JavaScript-код. У объекта или функции можно было вызвать метод toSource(), чтобы получить их исходный код в виде текста. Но это уже давно не так, сейчас тот же V8 компилирует скрипты перед исполнением, плюс к этому есть встроенные функции типа методов массива, так что телом функции сейчас может быть нативный код. Это одна из причин, почему функцию нельзя описать в виде объектного литерала.
Поправка — у функции всё ещё можно вызвать метод toString() и получить её исходный код или строку [native code]. Но это работает в одну сторону — нет способа задать или поменять код функции через какой-либо метод.
При этом функции являются объектами в полном смысле — с ними можно работать как с объектами, они имеют свои поля и методы, позволяют добавлять новые через присваивание. Но через присваивание полей нельзя поменять тело (код) функции. Также в JS нельзя превратить объект в функцию, поменяв его прототип. Иными словами, всё, что можно делать с объектами, можно делать с функциями, но не всё, что можно делать с функциями, можно делать с объектами.
Несмотря на то, что функции являются объектами, они имеют свой особый тип:
Стоит добавить, что ничто не мешает указать функцию внутри объектного литерала, описав таким образом его метод. По сути метод в JS-объекте — это и есть поле типа "функция":
Интересный факт — теоретически функцию можно создать, инстанцировав Function и передав ему тело в качестве аргумента. Это конечно не создание через объектный литерал, но по сути близко к нему:
Однако большинство современных браузеров запрещают такое поведение в целях безопасности. То есть, вторая причина, по которой нельзя создать функцию через литерал — это безопасность. Данные, приходящие с сервера, должны интерпретироваться как данные, и не должны по ошибке или в результате действий злоумышленника превращаться в исполняемый код.
Т.е. просто зависит от объема занимаемой памяти?Хотя вроде и нет.Просто принять это как данность. Понял,спасибо.