И что этим кодом можно увидеть? Скачки в несколько килобайт используемой памяти, связаны с работой сборщика мусора. Не в одном браузере утечек памяти не наблюдается.
Вот во время написания
фреймворка, я столкнулся с проблемой: при удалении узла через removeChild, в памяти остаются все дочерние узлы, на которые где-либо хранятся ссылки:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
window.onload = function() {
// Test 1
var div = document.getElementById('test1');
document.body.removeChild(document.getElementById('conteiner1'));
alert(div.id);
// Test 2
var div = document.getElementById('test2'), cont = document.getElementById('conteiner2');
while(cont.firstChild) cont.removeChild(cont.firstChild);
document.body.removeChild(cont);
alert(div.id);
// Test 3
document.body.removeChild(document.getElementById('conteiner3'));
alert(document.getElementById('test3'));
};
</script>
</head>
<body>
<div id="conteiner1">
<div id="test1">Test</div>
</div>
<div id="conteiner2">
<div id="test2">Test</div>
</div>
<div id="conteiner3">
<div id="test3">Test</div>
</div>
</body>
</html>
Это проблема стала еще более существенной из-за использования кэша по идентификаторам. Решить смог только удалением кэша после операций, связанных с удалением узлов и изменением идентификатора, хотя до сих пор остаются моменты, когда можно попасть в такую ситуацию.
Это конечно
не баг, а особенность, но даже метод removeNode в IE, который принимает параметр булевского типа, для явного указания того, что дочерние узлы должны быть удалены, в случае наличия ссылки на элемент, не делает этого
Впрочем, так ведет себя любой объект — остается в памяти, пока есть хоть одна ссылка на него
var obj = {a: 'aa'}, c = obj;
obj = null;
alert(c.a);
Кстати, чтобы оставить в памяти удаляемый узел, нужно написать так
var removedNode = parent.removeChild(node);