Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему такое противопоставление: "функция есть объект - функция"? (https://javascript.ru/forum/misc/57853-pochemu-takoe-protivopostavlenie-funkciya-est-obekt-funkciya.html)

nevro 23.08.2015 16:59

Почему такое противопоставление: "функция есть объект - функция"?
 
Если в ООП языке пишу "переменная типа String", например, то это значит: "объект лежит в куче, а в переменной - ссылка на него.". В JS, получается, так же можно сказать и про функции.
1. Если функция - это объект, то что тогда просто функция? В этом разделении есть какая-то техническая причина (работа со стеком или еще что)?
2. Замыкания - следствие такого решения ("функция есть объект")?

EmperioAf 23.08.2015 21:05

Здесь вам могут не ответить на такие вопросы(хотя раздел вы выбрали правильно, но здесь обитает меньше старожилов). Попробуйте завтра создать аналогичную тему в разделе Оффтопик

Safort 23.08.2015 23:37

Цитата:

Сообщение от EmperioAf (Сообщение 385320)
Здесь вам могут не ответить на такие вопросы(хотя раздел вы выбрали правильно, но здесь обитает меньше старожилов).

"Старожилы" смотрят не только Оффопик, но и "Новые сообщения" тоже и выбирают интересные для них темы, как и любые другие пользователи.

Цитата:

Сообщение от EmperioAf (Сообщение 385320)
Попробуйте завтра создать аналогичную тему в разделе Оффтопик

Попробуй не давать вредных советов новичкам.

MallSerg 24.08.2015 00:57

Цитата:

Сообщение от nevro
Если в ООП языке пишу "переменная типа String", например, то это значит: "объект лежит в куче, а в переменной - ссылка на него."


Если продолжишь так утверждать то тебя ждет частый стук граблями по носу =).
На самом деле все немного сложнее. У тебя есть переменная типа String и есть свойства и методы с помощью которых ты можешь работать с этой переменной. А где как и что лежит это уже скрыто за инкапсуляцией и не должно тебя волновать.

Цитата:

Сообщение от nevro
Если функция - это объект, то что тогда просто функция?

Объект и функция это разные типы данных(переменных) в JavaScript.
По этому утверждать что "функция - это объект" в корне неверно.
Функция в JS это специальный объект который реализует функтор.
"просто функций" не бывает.

ИМХО: замыкания, реализация функций, бедный набор базовых типов, странные механизмы приведения типов - это фичи JavaScript и следствие архитектуры хуяк хуяк и в продакшен.
JS разрабатывался и реализовывался одним человеком в течении недели =).

Erolast 24.08.2015 06:40

Цитата:

По этому утверждать что "функция - это объект" в корне неверно.
Верно.
console.log((function(){}) instanceof Object); //true


Цитата:

Функция в JS это специальный объект который реализует функтор.
"просто функций" не бывает.
Аха.

Цитата:

замыкания, реализация функций, бедный набор базовых типов
А что там не так?

Цитата:

странные механизмы приведения типов
Да, всегда раздражало(

Цитата:

JS разрабатывался и реализовывался одним человеком в течении недели =)
И развивался десятками членов TC39 с фидбеком тысяч программистов в течение 20 лет)

MallSerg 24.08.2015 10:50

Цитата:

Сообщение от Erolast
Верно.

1. console.log((function(){}) instanceof Object); //true

// Было бы верно если бы 
 alert (typeof (function(){}) == "object");
// instanceof работает по тому что функция это прямой наследник объекта
alert (typeof (function(){}).prototype == "object");

// но это разные типы по этому поведение у них разное и путать их себе дороже

Erolast 24.08.2015 15:49

http://www.ecma-international.org/ec...tions-function
Цитата:

Сообщение от спецификация
function
member of the Object type that may be invoked as a subroutine


MallSerg 24.08.2015 16:44

Эээээ

alert (typeof ({}) == "object"); // true как не удивильно но это объект
alert (typeof (function(){}) == "object"); // false это не объект это другой тип =)


Цитата:

Сообщение от Erolast
И развивался десятками членов TC39 с фидбеком тысяч программистов в течение 20 лет)

Первые пять лет чесали затылок и разбирать по чему это работает так а не этак. Потом пару лет писали не противоречивую спецификацию. Много о чем спорили много чего планировали но так практически ничего пока не поменяли. Именно по этому 99% современного кода будет работать на первых реализациях JS

Erolast 24.08.2015 17:32

Цитата:

alert (typeof ({}) == "object"); // true как не удивильно но это объект
alert (typeof (function(){}) == "object"); // false это не объект это другой тип =)
Да ну? Ты споришь со спецификацией?) Я же тебе ссылку дал - не веришь, пойди проверь, ну же.
Почему typeof выводит для функций отдельное обозначение - хз, возможно, для удобства и обратной совместимости.

Цитата:

Первые пять лет чесали затылок и разбирать по чему это работает так а не этак. Потом пару лет писали не противоречивую спецификацию. Много о чем спорили много чего планировали но так практически ничего пока не поменяли. Именно по этому 99% современного кода будет работать на первых реализациях JS
Вот тебе предельно простой современный код (мой обыденный от него только отсутствием проксей отличается). Запустишь в IE3? Ну ладно, хотя бы в IE10).

nevro 07.09.2015 20:20

Что в js функции это тоже объекты, кажется, пишут везде. Функции помещаются в стек: параметры, инструкции, возвращаемое значение. При этом есть понятие "функции первого класса". Не зря же их ввели - наверняка что бы не путать с обычными функциями. Тогда где-то тут должна быть разница.


Часовой пояс GMT +3, время: 11:56.