gpt4 book ai didi

javascript - JavaScript 会收集垃圾吗?

转载 作者:数据小太阳 更新时间:2023-10-29 05:48:29 24 4
gpt4 key购买 nike

每隔一段时间我就会发现自己在做一些类似下面的事情

var img = new Image();
img.src = 'php/getpic.php?z=' + imid + '&th=0';
img.onload = function(){drawImages(img,contexts,sizes)};

解释

  1. 创建 HTML 图像元素。
  2. 为其分配 src 属性
  3. 为其分配 onload 事件
  4. 将一个或多个 Canvas 上下文传递给事件处理程序
  5. 将加载的图像绘制到 Canvas 上

我不清楚的是 - JavaScript 垃圾收集器会处理丢弃 img 元素的任务,还是我需要自己做,否则会面临 slooow 内存泄漏?

最佳答案

会在 IE 6 和 7(以及非常旧的 FF 版本)中泄漏,因为它会在 JavaScript 和 DOM 之间创建循环引用。 IE 6 和 7 无法垃圾回收任何在两个世界之间具有循环引用的对象,因为它们使用单​​独的垃圾回收器。

现代浏览器可以在不泄漏的情况下处理这个问题。

为防止它在 IE 6 和 7 中泄漏,请在完成 img 后执行此操作:

img.onload = null;

如果您只关心现代浏览器,则不必担心。 (我很高兴 IE 6 和 7 的市场份额终于低到足以表明这一点!)


更新

您分配给 onload 的函数创建了一个闭包。该闭包包含对 img 的引用。 img 不能从 DOM 的内存中被垃圾回收,只要该闭包存在于 JScript 的内存中(JScript 是 JavaScript 的 IE 实现的名称)。同样,只要 img 存在于 DOM 内存中,就不能从 JScript 内存中对闭包进行垃圾回收,因为 img.onload 引用了您的函数。这是一个循环引用。换句话说,仅仅因为 drawImages 执行一次并不意味着它不会再次执行(JScript 引擎不知道 onload 只触发一次——那是 DOM 的域),因此 JScript 必须保持闭包事件。

您展示的模式是已知会在 IE 6 和 7 中造成内存泄漏的经典模式。它包括 (1) DOM 节点,(2) 该 DOM 节点上创建闭包的事件处理程序, (3) 对闭包内该 DOM 节点的引用。

关于javascript - JavaScript 会收集垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com