Вопрос о циклических ссылках (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, время: 06:24. |