![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
а как это меньше? тогда уж по этой логике функция будет одна (в (с дуру) ActiveXObject.prototype) и свойство element.changeDisplayValue будет содержать ссылку на ActiveXObject.prototype.changeDisplayValue (а я вот забыл - или не ссылку? что происходит при присваивании функции? - копия или ссылка? (плохо, когда не знаешь, да еще и забудешь =)) А если копия - то так же "много" функций создастся) |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Если верить спецификации, то это должна быть ссылка. Вообще любой идентификатор, будь то имя функции, переменной, свойства и т.д. - это должно быть "нечто" ссылочного типа (value of type Reference) в тот момент, когда вычисляется значение этого самого идентификатора. Однако, "ссылочный тип" преподносится спецификацией, как абстракция, и служит лишь для того, чтобы описать то, как должен "вести" себя движок при вычислении значений. А вот как это выглядит "изнутри" какого-либо отдельно взятого движка - это другой вопрос. Хотя, по простому говоря, кому захочется реализовать процесс присвоения св-в так, как-будто это ссылки, а "втихомолку" создавать копии?
|
|||
|
||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
ага, стало быть ссылка =) (ну то и было интуитивно ясно, надо было только уточнить (опять лень было мне написать подобный простой пример)). Ну и преимущества "хранилища, на которое все будут ссылаться" перед "... = function() {}" сразу проясняются. И тогда будет все-таки одна функция, а не "js-функций будет создаваться значительно меньше" =)
|
|||
|
||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
однако,
Я могу предположить только так: если даже это ссылка, а не копия - то при удалении оригинала происходит копирование всех свойств в "копию", либо на этапе присвоения (F.prop = 1;) происходит копия во все связанные объекты. Опять же, гадать как-то не правильно, поэтому кто знает, подскажите, как "на самом деле" =) |
|||
|
||||
AKS |
|
||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
То, что Вы приняли за "удаление оригинала" - это не что иное, как присвоение нового значения идентификатору F. Причем Вы присвоили новое значение не имени функции, а одноименному свойству объекта Global. У функции имя осталось прежнее:
Пояснение из ECMAScript Language Specification Edition 3 (10.1.3 Variable Instantiation):
Сама функция F остается в памяти, т.к. есть идентификаторы, на нее ссылающиеся (это f). Вот если и его "обналлить", то появится шанс, что garbage collector "приберет к рукам" этот "бесхозный" объектик (но это еще на воде вилами писано, как говорится, т.к. происходит это лишь в определенных условиях). Это сообщение отредактировал(а) AKS - 10.1.2008, 21:28 |
||||
|
|||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
хм, получается в variable object (VO) для объектов (вернее, для не примитивных типов) есть привилегии. Т.е. если есть ссылки на какой-то объект, то удалить его (перезаписав новые данные в этот "слот" (с именем "F")) нельзя. Похожий пример:
Тогда еще вопрос - где в VO (описано ли это в спецификации?) хранится "копия" перезаписанного объекта? Ведь доступа к нему уже нет (именно к оригиналу, я имею в виду). В "слот" n записывается новый объект и свойства prop больше не имеет. Однако, m все еще (ведь это же ссылка, а не копия) цепляет его (prop) из "неизвестного места в VO". |
|||
|
||||
AKS |
|
||||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
С примитивами такая же история:
Судя по всему, хранится объект (или примитив), позволяя "цепляться" за себя, не в VO, а где-то в памяти (как выделяется память, сколько, и чего, и под какие конкретные цели - с этим я еще не знакомился). А в VO есть лишь св-во, являющееся ссылкой (pointer) на определенные данные (значение), занимающие определенную область памяти. Это св-во можно удалить или переопределить, тем самым давая понять сборщику мусора, что та область памяти, на которую ранее это св-во ссылалось, может быть освобождена. Однако, если изначально значение переопределяемого (удаляемого) св-ва было "сохранено" в каком-либо другом св-ве (или переменной), то, конечно же, объект (или что-то еще) из той области памяти будет продолжать "жить" дальше. |
||||||||
|
|||||||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
с чего бы вдруг? разве они не по значению присваиваются (копируются)? Понятно, что m - 1, но здесь-то значение было именно скопировано. Или нет? Что, и примитивы по ссылке присваиваются? Не верится что-то.. |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
А может и объекты, также как примитивы, копируются по значению (и получается что-нибудь, вроде описанного в 13.1.2 Joined Objects). Разве в этом разберешься без того, кто написал ECMAScript-движок. Это сообщение отредактировал(а) AKS - 10.1.2008, 23:49 |
|||
|
||||
egao |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 6.8.2007 Репутация: -1 Всего: нет |
какой ещё экмадвижок?
![]() ![]() |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
egao, на вопрос "какой ещё экмадвижок?", могу ответить то, что я имел ввиду реализацию ECMAScript Language, соответствующую (или претендующую на соответствие) спецификации языка.
dsCode, сегодня, перечитав кое-что (вот это, в частности), попытался собрать мысли "в кучу". Итак, вот как можно было резюмировать то, что "всплыло" на последнем этапе обсуждения:
P.S. Убрал "строки сравниваются как ссылки" - сам же ниже уже написал, как варьируется сравнение. Это сообщение отредактировал(а) AKS - 11.1.2008, 11:32 |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Совершенно неубедительно ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
ksnk, а вот Вы объясните (по буквам), что происходит в вашем примере.
![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Ok! Оспаривается утверждение, что
В этом случае конструкция x+=чего-то там должна бы, по идее, изменить этот самый x -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
AKS, ну первые два пункта и так всегда были ясны (это в каждой книжке по программированию пишут, не знаю, как насчет JavaScript, но думаю, эту идеологию они тоже вполне поддержали), смущало лишь то, что идентификатор затирается (переписывается новым значением), а старое значение остается в памяти, т.к. есть ссылки. А вот со строками получается new String('test') будет сравниваться с меньшими затратами, чем 'test'.
|
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |