javascript - 是否会使用 GC 从浏览器内存中删除不在 DOM 中但带有附加处理程序的元素?
问题描述
为了在我的 js 脚本中获取图像尺寸,我创建了临时<img>
元素而不将其附加到 DOM。这是我编写的函数的简化版本:
function testImage(i) {
let tester = document.createElement('img');
tester.onload = function() { console.log(tester.naturalWidth); }
tester.src = `${i}.jpg`;
}
tester
仅在函数内部使用。tester
永远不会被绑定到 DOM。- onload 函数与此有关
tester
。我想知道它是否会干扰垃圾收集器。
让我们假设这可以被调用很多很多次。那些测试人员会消耗内存吗?或者垃圾收集器会删除它们吗?
PS:控制台for (let k=0; k < 1000000000; k++) { testImage(k) }
吃掉了我的全部记忆。
PS2:我知道我可以编写脚本来重用相同的<img>
元素或元素。但我对第一种方法很好奇。
UPD:正如@rojo所说,GC会清理内存,但在我的情况下我没有注意到它,因为:
看起来 GC 不会在同步循环中清理内存(至少在浏览器中)。该行
for (let k=0; k < (1000*1000); k++) { testImage(k) }
会占用大量内存,但执行 1000 次测试的 1000 次循环setTimeout
不会消耗太多内存。手动执行不同大小的循环表明循环完成后内存释放。此特定脚本将许多日志写入浏览器控制台。如果控制台是打开的,它会消耗更多的内存来保存日志。当我重写测试器以防止日志记录时,打开控制台的内存消耗减少了,但 GC 的工作方式相同。
解决方案
基于MDN(向下滚动到限制:循环引用),这些变量将被删除。
一旦函数完成,函数内部创建的所有变量都将被删除,没有例外。
function foo() {
var a = "data";
console.log(a); // "data"
} // variable is deleted
console.log(a); // Uncaught ReferenceError: a is not defined
推荐阅读
- javascript - 更改 $_Get 值而不重新加载整个页面内容
- javascript - 查找第一个外部标签内的所有标签
- c - 关于如何为 Linux 字符设备驱动程序设置文件操作的困惑
- java - 在 Windows 上使用 cmd 运行文件
- amazon-web-services - aws ec2 实例和弹性云部署之间的隧道
- redis - 我应该创建多个hiredis对象吗?
- gdb - gdb 运行时错误:找不到文件,溢出错误:int 太大而无法转换
- java - 删除生产服务器中的 MaxMetaspaceSize ("-XX:MaxMetaspaceSize=1g") 参数导致另一个错误:堆内存不足错误
- flutter - 如何在中间渲染gridviewbuilder的最后一个元素
- ios - Safari 网络检查器仅显示源、控制台和审核