关注这个问题有一阵子了。网上找找,Douglas Crockford 的文章《JScript Memory Leaks》有详细说明,鸟食轩也有一系列相关文章。
以下是对《JScript Memory Leaks》一文的节选翻译,大致说明了ie内存泄漏的原因。
“microsoft的ie浏览器有许多内存泄漏问题,最严重的就是使用jscript交互引发。当dom节点包含了一个对javascript对象(如事件处理函数onclick)的引用,同时该javascript对象也引用此节点时(如鼠标单击时隐藏节点),就形成了一个循环结构。它本身没有问题——当对dom节点和事件处理函数的引用消失,garbage collector(一个自动的内存资源管理器)会回收它们,使它们占用的空间再分配。javascript的garbage collector理解循环,不会产生问题。不幸的是,ie的dom不归jscript管。ie有自己的内存管理器却不理解循环,因此产生混乱。结果,当循环出现,却没有内存回收,没被回收的内存就泄漏了。时间长了,就会导致内存不足,当内存空间涨满,浏览器就死了。”
注:“javascript”指的是语言本身,“jscript”是microsoft的类似javascript脚本语言。
Crockford 建议的解决方法是:在删除含有对javascript对象引用的dom节点之前,把属性中类型为function的全部清除(设为null)。我试过,确实有效。