它会在IE 6 和 7 (以及非常旧的 FF 版本)中泄漏,因为它会在 JavaScript 和 DOM 之间创建循环引用。IE 6 和 7 不能垃圾收集在两个世界之间具有循环引用的任何对象,因为它们使用单独的垃圾收集器。
现代浏览器可以在不泄漏的情况下处理这个问题。
为防止它在 IE 6 和 7 中泄漏,请在完成以下操作后执行此操作img
:
img.onload = null;
如果您只关心现代浏览器,则不必担心。(我很高兴 IE 6 和 7 的市场份额终于低到足以表明这一点!)
更新
您分配给的函数onload
创建一个闭包。该闭包包含对img
. img
只要该闭包存在于 JScript 的内存中(JScript 是 JavaScript 的 IE 实现的名称),就不能从 DOM 的内存中进行垃圾回收。同样,只要img
存在于 DOM 的内存中,闭包就不能从 JScript 的内存中进行垃圾回收,因为img.onload
它引用了您的函数。这是一个循环引用。换句话说,仅仅因为drawImages
执行一次并不意味着它不会再次执行(JScript 引擎不知道onload
只触发一次——那是 DOM 的域),所以 JScript 必须保持闭包处于活动状态。
您展示的模式是已知会在 IE 6 和 7 中造成内存泄漏的经典模式。它包括 (1) 一个 DOM 节点,(2) 该 DOM 节点上创建闭包的事件处理程序,以及 (3 ) 对闭包内该 DOM 节点的引用。