一个js内存泄露的好例子
原帖在这里:http://topic.csdn.net/u/20090531/20/e0d47c96-3eb6-45ca-b824-31dddedd58c5.html,
我把楼主的例子改了一下,觉得这样写更紧凑!套用楼主的原话,当一个DOM对象包含一个Js对象的引用(例如一个Event Handler), 而这个Js对象又持有对这个DOM对象的引用时,一个环状引用就行成了,于是在ie下就出现了内存泄露。点击“运行代码”并打开任务管理器看内存变化。分别在ie8和ff下测试,差距不用多说。
运行代码 <script type="text/javascript"></script> <html><head><title>Memory leak</title><style>body{padding: 10px;}</style></head><body></body><script>var q = [];var n = 0;setInterval(function(){q.push(makeSpan());if(q.length>=10){var s = q.shift();if(s){s.parentNode.removeChild(s);}}n++;},10);function makeSpan(){var s = document.createElement("span");document.body.appendChild(s);var t=document.createTextNode("*** " + n + " ***");s.appendChild(t);s.οnclick=function(e){s.style.backgroundColor="red";alert(n);};return s;};</script> </html>
那么在ie下该怎么解决呢?
在删除节点的时候,手动破除环状引用,把里面setInterval那段代码稍微改动以下:
setInterval(function(){q.push(makeSpan());if(q.length>=10){var s = q.shift();if(s){s.onclick = null;//关键在这里s.parentNode.removeChild(s);}}n++; },10);
再用ie测试.
总结
以上是生活随笔为你收集整理的一个js内存泄露的好例子的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: CAD地形图等高线标高批量取整工具,解决
- 下一篇: 【STC15】串口使用