Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DOM (HTML) Element в IE - от кого наследуется? 
:(
    Опции темы
dsCode
Дата 9.1.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Цитата(AKS @  9.1.2008,  08:23 Найти цитируемый пост)
то js-функций будет создаваться значительно меньше

а как это меньше? тогда уж по этой логике функция будет одна (в (с дуру) ActiveXObject.prototype) и свойство element.changeDisplayValue будет содержать ссылку на ActiveXObject.prototype.changeDisplayValue (а я вот забыл - или не ссылку? что происходит при присваивании функции? - копия или ссылка? (плохо, когда не знаешь, да еще и забудешь =)) А если копия - то так же "много" функций создастся)


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 9.1.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  9.1.2008,  17:52 Найти цитируемый пост)
что происходит при присваивании функции? - копия или ссылка?

Если верить спецификации, то это должна быть ссылка. Вообще любой идентификатор, будь то имя функции, переменной, свойства и т.д. - это должно быть "нечто" ссылочного типа (value of type Reference) в тот момент, когда вычисляется значение этого самого идентификатора. Однако, "ссылочный тип" преподносится спецификацией, как абстракция, и служит лишь для того, чтобы описать то, как должен "вести" себя движок при вычислении значений. А вот как это выглядит "изнутри" какого-либо отдельно взятого движка - это другой вопрос. Хотя, по простому говоря, кому захочется реализовать процесс присвоения св-в так, как-будто это ссылки, а "втихомолку" создавать копии?
Код

function F() {
};

var f = F; // ну, создали, например, копию

F.prop = 1; // оригинал "получил" новое св-во

alert(f.prop); // новое св-во волшебным образом появилось в "копии"?


PM MAIL   Вверх
dsCode
Дата 9.1.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



ага, стало быть ссылка =) (ну то и было интуитивно ясно, надо было только уточнить (опять лень было мне написать подобный простой пример)). Ну и преимущества "хранилища, на которое все будут ссылаться" перед "... = function() {}" сразу проясняются. И тогда будет все-таки одна функция, а не "js-функций будет создаваться значительно меньше" =)


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
dsCode
Дата 10.1.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



однако,

Код

function F() {
};
var f = F; // ну, создали, например, копию
F.prop = 1; // оригинал "получил" новое св-во
alert(F);
alert(f.prop); // новое св-во волшебным образом появилось в "копии"?
F = null // затем "удалили" оригинал
alert(F);
alert(f.prop); // новое св-во "волшебным" образом все еще в копии?


Я могу предположить только так: если даже это ссылка, а не копия - то при удалении оригинала происходит копирование всех свойств в "копию", либо на этапе присвоения (F.prop = 1;) происходит копия во все связанные объекты. Опять же, гадать как-то не правильно, поэтому кто знает, подскажите, как "на самом деле" =)


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 10.1.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  10.1.2008,  20:39 Найти цитируемый пост)
F = null // затем "удалили" оригинал

То, что Вы приняли за "удаление оригинала" - это не что иное, как присвоение нового значения идентификатору F. Причем Вы присвоили новое значение не имени функции, а одноименному свойству объекта Global. У функции имя осталось прежнее:
Код

function F() {
};

var f = F;

alert(F); // -> function F() {}

F = null;

alert(f); // -> function F() {}

Пояснение из ECMAScript Language Specification Edition 3 (10.1.3 Variable Instantiation):
Цитата

For each FunctionDeclaration in the code, in source text order, create a property of the variable object whose name is the Identifier in the FunctionDeclaration, whose value is the result returned by creating a Function object as described in section 13...

Сама функция F остается в памяти, т.к. есть идентификаторы, на нее ссылающиеся (это f). Вот если и его "обналлить", то появится шанс, что garbage collector "приберет к рукам" этот "бесхозный" объектик (но это еще на воде вилами писано, как говорится, т.к. происходит это лишь в определенных условиях).


Это сообщение отредактировал(а) AKS - 10.1.2008, 21:28
PM MAIL   Вверх
dsCode
Дата 10.1.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



хм, получается в variable object (VO) для объектов (вернее, для не примитивных типов) есть привилегии. Т.е. если есть ссылки на какой-то объект, то удалить его (перезаписав новые данные в этот "слот" (с именем "F")) нельзя. Похожий пример:

Код

var n = new Number(1);
n.prop = 'prop';
var m = n;
n = new Number(2);
alert(n.prop);
alert(m.prop);


Тогда еще вопрос - где в VO (описано ли это в спецификации?) хранится "копия" перезаписанного объекта? Ведь доступа к нему уже нет (именно к оригиналу, я имею в виду). В "слот" n записывается новый объект и свойства prop больше не имеет. Однако, m все еще (ведь это же ссылка, а не копия) цепляет его (prop) из "неизвестного места в VO".



--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 10.1.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  10.1.2008,  22:06 Найти цитируемый пост)
...получается в variable object (VO) для объектов (вернее, для не примитивных типов) есть привилегии. 

С примитивами такая же история:
Код

var n = 1;

var m = n;

n = 2;

alert(m); // -> 1


Цитата(dsCode @  10.1.2008,  22:06 Найти цитируемый пост)
...где в VO (описано ли это в спецификации?) хранится "копия" перезаписанного объекта?


Цитата(dsCode @  10.1.2008,  22:06 Найти цитируемый пост)
Однако, m все еще (ведь это же ссылка, а не копия) цепляет его (prop) из "неизвестного места в VO".


Судя по всему, хранится объект (или примитив), позволяя "цепляться" за себя, не в VO, а где-то в памяти (как выделяется память, сколько, и чего, и под какие конкретные цели - с этим я еще не знакомился). А в VO есть лишь св-во, являющееся ссылкой (pointer) на определенные данные (значение), занимающие определенную область памяти. Это св-во можно удалить или переопределить, тем самым давая понять сборщику мусора, что та область памяти, на которую ранее это св-во ссылалось, может быть освобождена. Однако, если изначально значение переопределяемого (удаляемого) св-ва было "сохранено" в каком-либо другом св-ве (или переменной), то, конечно же, объект (или что-то еще) из той области памяти будет продолжать "жить" дальше. 



PM MAIL   Вверх
dsCode
Дата 10.1.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Цитата(AKS @  10.1.2008,  23:18 Найти цитируемый пост)
С примитивами такая же история:

с чего бы вдруг? разве они не по значению присваиваются (копируются)? Понятно, что m - 1, но здесь-то значение было именно скопировано. Или нет? Что, и примитивы по ссылке присваиваются? Не верится что-то..


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
AKS
Дата 10.1.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(dsCode @  10.1.2008,  23:31 Найти цитируемый пост)
...разве они не по значению присваиваются (копируются)?

А может и объекты, также как примитивы, копируются по значению (и получается что-нибудь, вроде описанного в 13.1.2 Joined Objects). Разве в этом разберешься без того, кто написал ECMAScript-движок.


Это сообщение отредактировал(а) AKS - 10.1.2008, 23:49
PM MAIL   Вверх
egao
Дата 11.1.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.8.2007

Репутация: -1
Всего: нет



какой ещё экмадвижок? smile сначала был яваскрипт, потом появился жскрипт, а потом люди собрались и решили стандартизировать язык. и назвали его экмаскрипт, который пока нигде полностью так и не реализован smile
PM MAIL   Вверх
AKS
Дата 11.1.2008, 11:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



egao, на вопрос "какой ещё экмадвижок?", могу ответить то, что я имел ввиду реализацию ECMAScript Language, соответствующую (или претендующую на соответствие) спецификации языка.

dsCode, сегодня, перечитав кое-что (вот это, в частности), попытался собрать мысли "в кучу". Итак, вот как можно было резюмировать то, что "всплыло" на последнем этапе обсуждения:
  • Числовые и логические значения копируются, передаются в качестве аргументов и сравниваются по своему значению. Когда такие значения копируются или передаются, то всякий раз создается новое пространство в памяти,  где будет "храниться" копия. И такая копия - это новая, отличная от оригинала сущность. Поэтому изменение оригинала никак не сказывается на копии, и наоборот.
  • Объекты, массивы и функции, являясь сами по себе ссылкой на данные в памяти, копируются, передаются в качестве аргументов и сравниваются соответственно, как ссылки. В момент копирования или передачи ссылки создается указатель на оригинал, и он используется, как если бы это была копия. Если изменяется оригинал, то меняется и копия (и наоборот). Но это всегда одна и та же сущность, поскольку копия на самом деле является лишь такой же ссылкой на данные, какой является оригинал. При сравнении переменных, значением которых является ссылка на объект, проверяется являются ли они ссылками на один и тот же объект или нет.
  • Со строками ситуация немного иная, чем с числовыми или логическими значениями. Строки копируются и передаются в качестве аргументов как ссылки. Таким образом, появляется возможность сократить расход памяти. При сравнении строк также есть отличия. Если сравниваются строковые объекты, то сравнение, как и положено объектам, будет производиться по ссылкам. Но если одна из строк (а уже тем более, если обе) – это примитивное значение, то сравниваться будут именно значения этих строк.

P.S. Убрал "строки сравниваются как ссылки" - сам же ниже уже написал, как варьируется сравнение.

Это сообщение отредактировал(а) AKS - 11.1.2008, 11:32
PM MAIL   Вверх
ksnk
Дата 11.1.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  11.1.2008,  11:01 Найти цитируемый пост)
Строки копируются, передаются в качестве аргументов и сравниваются как ссылки.

Код

var x='string';
var y=function(x){return x+=' one more string'};
alert([y(x),x])

Совершенно неубедительно smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 11.1.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



ksnk, а вот Вы объясните (по буквам), что происходит в вашем примере. smile
PM MAIL   Вверх
ksnk
Дата 11.1.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Ok! Оспаривается утверждение, что 
Цитата(AKS @  11.1.2008,  11:01 Найти цитируемый пост)
Строки ... передаются в качестве аргументов ... как ссылки
 В этом случае конструкция x+=чего-то там должна бы, по идее, изменить этот самый x



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
dsCode
Дата 11.1.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



AKS, ну первые два пункта и так всегда были ясны (это в каждой книжке по программированию пишут, не знаю, как насчет JavaScript, но думаю, эту идеологию они тоже вполне поддержали), смущало лишь то, что идентификатор затирается (переписывается новым значением), а старое значение остается в памяти, т.к. есть ссылки. А вот со строками получается new String('test') будет сравниваться с меньшими затратами, чем 'test'.


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1466 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.