| 
 Вопрос о циклических ссылках (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 не сможет её удалить? Или я где-то напутала? Заранее спасибо за ответы. | 
| 
 Цитата: 
 В 8-м осле проблема циклических ссылок устранена. | 
| 
 Спасибо за ответ, vk65535! Правда не всё до конца ясно  Вот если бы вы свойству onclick присвоили бы ссылку на функцию с замыканием, содержащим ссылку на этот dom-элемент - тогда другое дело.Можно объяснить чуть подробнее этот момент? Ведь Hide - сама является замыканием и через приватную переменную var privateDiv ссылается на элемент myDiv. В 8-м осле проблема циклических ссылок устранена.По-моему проблема циклических ссылок устранена уже в 7. Но увы и ах приходится до сих пор поддерживать 6-й. | 
| 
 Вот пример, приводящий к ликам. 
<!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. Здесь мелкомягкие балуются по этому поводу самокритикой. | 
| 
 Цитата: 
 Цитата: 
 Цитата: 
 p.s. про патч и псевдоутечки | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 Цитата: 
 | 
| 
 Я наверное не правильно понял слово broken (сломанные, глючные). Если имеется в виду, что они, типа, рвутся и освобождаются - то это не так, попробуйте. 
for (var i = 0, e; i < 1000000; ++i) (e = document.createElement('div')).e = e;
 | 
| 
 Цитата: 
 
<!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>
 | 
| 
 В этом примере цикл действительно есть. В первом примере его нет. | 
| Часовой пояс GMT +3, время: 17:58. |