Показать сообщение отдельно
  #18 (permalink)  
Старый 12.11.2009, 12:24
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Plest
По Вашим замечаниям мне осталось поправить части статьи о следующих вещах:
функциональный аргумент,
Функциональный аргумент - это термин используемый в функциональных языках и означающий, что аргументом некой функции, является так же - функция. Функция, принимающая функциональный аргумент, называется функционалом (в математике - оператор).

Функции же, возвращающие другие функции, называются функции с функциональным значением.

Я затрагивал эти определения в статье о замыканиях в ES.

Функциональный аргумент (сокращённо, "Фурарг", "Funarg") - это одна из "проблем" стековой организации локальных переменных. Решением этой проблемы и являются замыкания, которые запоминают весь лексический контекст ещё на этапе создания. Соответственно, локальные переменные хранятся уже не в стеке, а в "куче" (heap).

C другой стороны, коллбэк (callback) - тоже подходит под определение и не завязан на чисто функциональные языки. Например, в Си, это просто указательно на функцию, и, если область определения этой функции уже удалена, то коллбэк не отработает.

Поскольку в ES все функции являются замыканиями, то теоретически, термин функциональный аргумент подошёл бы больше. Хотя, и коллбэк - тоже вписывается.

Двояко, на самом деле. Возможно даже, функциональный аргумент - это частный случай коллбэка, а не наоборот, как я отмечал выше, но я, опять же, имел в виду относительно ES.

Поэтому можно оставить и коллбэк, сильной принципиальной разницы нет. К тому же, коллбэк, действительно, более привычное и распространённое понимание передачи кода параметров в функцию.

Сообщение от Plest
constructor
Свойство constructor привилегированно лишь двумя моментами: (1) оно автоматом создаётся при создании объектов-функций и записывается в свойство функции prototype и (2) свойство constructor в этом случае получает {DontEnum}, т.е. не выводится в for...in.

За исключением того, что порождённые от функции-конструктора объекты, будут находить это свойство в своём прототипе (ведь оно было добавлено в Функция.prototype при создании Функции), ничего примечательного больше с этим свойством не связано. Его можно свободно удалить или изменить.

Т.е. основной момент, что свойство constructor - это свойство прототипа объекта, но не родное свойство. Соответственно, утверждение, что все объекты при порождение получают свойство constructor - неверное. Ни один из объектов не получает свойство constructor при порождении (кроме как объекта, являющегося свойством prototype фунцкии), но объекты наследуют это свойство из своего прототипа, поскольку прототип объектов - [[Prototype]] был установлен из свойства функции prototype (или же из Object.prototype, если на момент порождения Функция.prototype не являлся объектом).

Сообщение от Plest
конструктор
Конструктор в ES - это любая функция; функция любого типа: будь то, декларация функции (Function Declaration), функция-выражение (Function Expression) или функция, созданная конструктором Function.

Если разобрать глубже, то код самой функции является инициализирующим, поскольку за создание объекта отвечает на сама функция, а её внутреннее свойство [[Construct]].

[[Construct]] - это общий конструктор для всех объектов. Когда создаются функции, все они получают внутреннее свойство [[Construct]].

Оператор new, соответственно, вызывает метод [[Construct]], который и создаёт объект. И уже затем, сам [[Construct]], вызывает функцию в контексте вновь созданного объекта, т.е. делает что вроде: Функция.apply(созданныйОбъек , arguments);.

Более подробно о конструкторе - в седьмой части. Там же - алгоритм создания объектов.

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

Для Википедии, поскольку там должно быть описание не чисто теоретико-сухое и не чересчур углублённое, а - для точного, но основного понимания, может быть следующим:

Конструктор в ES- это (любая) функция, являющаяся шаблоном для порождаемых объектов. Применённая к оператору new, она создаёт объект и инициализирует его, будучи вызванной в контексте созданного объекта. За непосредственное выделение памяти и создание объекта, отвечает её внутренний метод [[Construct]], который является стандартным конструктором для всех объектов и записывается в каждую функцию при её создании. Не обязательно в таком виде, но с этой сутью.

Хотя, можно и срезать дебри про [[Construct]] и вынести чуть ниже. Т.е. сделать основное описание, что - это функция, создающая и инициализирующая объект посредством this (у вас сейчас примерно так и написано). И написать, что подробное определение смотрите чуть ниже (кому интересно).
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 12.11.2009 в 12:33.
Ответить с цитированием