Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.01.2010, 17:01
Новичок на форуме
Отправить личное сообщение для BlueIce Посмотреть профиль Найти все сообщения от BlueIce
 
Регистрация: 05.01.2010
Сообщений: 4

Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt)
Привет!
На данный момент существует большая потребность разобраться в циклических ссылках. Поэтому знающих людей очень прошу помочь с нижеследующим примером. Есть такой javascript код и html.

<html>
<head>
<script type="text/javascript">   
function SuperDiv(id) {
        var privateDiv;
        this.Init() = function() { privateDiv = document.getElementById(id);}
        this.Hide() = function() { privateDiv.style.display = "none"; };
}

        var mySuperDiv = new SuperDiv("myDiv");    
</script>
</head>
<body onload="mySuperDiv.Init()">
<div id="myDiv" onclick="mySuperDiv.Hide()"></div>
</body>
</html>


Вопрос такой - образуется ли при таком подходе циклическая ссылка JavaScript -> Dom -> JavaScipt? (Особое внимание !!!
Вопрос не в том - правилен ли такой код или нет. И есть ли в нём смысл или нет! Это просто пример!

Насколько я понимаю - при создании замыкания функцией Hide - она сохраняет ссылку на объект переменных функции SuperDiv (для доступа к приватной переменной privateDiv). privateDiv держит ссылку на Dom элемент myDiv. А myDiv, в свою очередь, ссылается на функцию Hide через свойство onclick. Т е это циклическая ссылка и сборщик мусора IE не сможет её удалить? Или я где-то напутала?

Заранее спасибо за ответы.
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2010, 19:18
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Сообщение от BlueIce Посмотреть сообщение
А myDiv, в свою очередь, ссылается на функцию Hide через свойство onclick.
В том то и дело, что не ссылается. Функция работает в контексте элемента, а ссылка на функцию Hide извлекается из глобального контекста через переменную mySuperDiv. Вообще, текстовым обработчиком создать цикл при всем желании не получится. Вот если бы вы свойству onclick присвоили бы ссылку на функцию с замыканием, содержащим ссылку на этот dom-элемент - тогда другое дело.

В 8-м осле проблема циклических ссылок устранена.
Ответить с цитированием
  #3 (permalink)  
Старый 01.02.2010, 20:44
Новичок на форуме
Отправить личное сообщение для BlueIce Посмотреть профиль Найти все сообщения от BlueIce
 
Регистрация: 05.01.2010
Сообщений: 4

Спасибо за ответ, vk65535! Правда не всё до конца ясно
Вот если бы вы свойству onclick присвоили бы ссылку на функцию с замыканием, содержащим ссылку на этот dom-элемент - тогда другое дело.
Можно объяснить чуть подробнее этот момент? Ведь Hide - сама является замыканием и через приватную переменную var privateDiv ссылается на элемент myDiv.

В 8-м осле проблема циклических ссылок устранена.
По-моему проблема циклических ссылок устранена уже в 7. Но увы и ах приходится до сих пор поддерживать 6-й.
Ответить с цитированием
  #4 (permalink)  
Старый 02.02.2010, 11:45
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Вот пример, приводящий к ликам.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><body><button onclick="leak()">leak</button><script type="text/javascript">
var createBlock = function() {
	var e = document.createElement('div');
	e.onclick = function(){};
},
leak = function() {
	for (var i = 0; i < 10000; ++i) createBlock();
};
</script></body></html>


Проверяется очень просто.
dom-element -> onclick function -> var e -> dom-element

В 7-м, к сожалению, не устранена, а то б давно уже забил на эту проблему.

P.S. Здесь мелкомягкие балуются по этому поводу самокритикой.

Последний раз редактировалось vk65535, 02.02.2010 в 11:49.
Ответить с цитированием
  #5 (permalink)  
Старый 02.02.2010, 15:49
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от BlueIce
Насколько я понимаю - при создании замыкания функцией Hide
замыкание - это и есть функция

Сообщение от vk65535
В 7-м, к сожалению, не устранена
Цитата:
In Internet Explorer 7, these circular references are broken when users navigate away from the page that contains the leaks.
это проблема, если пользователь долго находится на странице и что-то периодически происходит, например, опрос почтового сервера

p.s. про патч и псевдоутечки
Ответить с цитированием
  #6 (permalink)  
Старый 02.02.2010, 16:19
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Сообщение от x-yuri Посмотреть сообщение
это проблема, если пользователь долго находится на странице и что-то периодически происходит
А какая разница, сколько находится пользователь на странице, если от перезагрузки страниц память не освобождается? ) Он может ходить по багнутым сайтам и осел скушает всю раму с той же охотой.
Ответить с цитированием
  #7 (permalink)  
Старый 03.02.2010, 21:19
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от vk65535
А какая разница, сколько находится пользователь на странице, если от перезагрузки страниц память не освобождается?
Сообщение от msdn
In Internet Explorer 7, these circular references are broken when users navigate away from the page that contains the leaks.
я торможу?
Ответить с цитированием
  #8 (permalink)  
Старый 04.02.2010, 17:49
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Я наверное не правильно понял слово broken (сломанные, глючные).
Если имеется в виду, что они, типа, рвутся и освобождаются - то это не так, попробуйте.
for (var i = 0, e; i < 1000000; ++i) (e = document.createElement('div')).e = e;

Последний раз редактировалось vk65535, 04.02.2010 в 17:58.
Ответить с цитированием
  #9 (permalink)  
Старый 11.02.2010, 19:56
Новичок на форуме
Отправить личное сообщение для BlueIce Посмотреть профиль Найти все сообщения от BlueIce
 
Регистрация: 05.01.2010
Сообщений: 4

Сообщение от vk65535 Посмотреть сообщение
В том то и дело, что не ссылается. Функция работает в контексте элемента, а ссылка на функцию Hide извлекается из глобального контекста через переменную mySuperDiv. Вообще, текстовым обработчиком создать цикл при всем желании не получится. Вот если бы вы свойству onclick присвоили бы ссылку на функцию с замыканием, содержащим ссылку на этот dom-элемент - тогда другое дело.

В 8-м осле проблема циклических ссылок устранена.
vk65535, и всё-таки мне кажется циклическая ссылка есть. Свой первый пример переписала в более простом виде. onclick присваивается функция, которая имеет через замыкание ссылку на сам объект DOM. Разве не так?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>
<body>
<div id="myDiv"></div>
<script type="text/javascript">  

document.getElementById("myDiv").onclick = (function() {  
var e = document.getElementById("myDiv");   
return function hide() { e.style.display = "none"; };
})();  
</script></body></html>
Ответить с цитированием
  #10 (permalink)  
Старый 17.02.2010, 21:51
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

В этом примере цикл действительно есть. В первом примере его нет.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск