IE 因在闭包中引用 DOM 元素而导致内存泄漏?

2024-05-05

在最近的一次采访中,有人问我:“像这段代码一样,在引用 DOM 元素时使用闭包有什么危险?”

var firstNameValue = (function(elementId) {
    var firstName = document.getElementById(elementId);
    return firstName.value;
})("firstName");

显然,我不知道的是,上面的代码在 IE 中造成了内存泄漏。给定的基本原理相当模糊,我不明白,但显然这可能只适用于较旧的 IE 版本?

任何人都可以详细说明这一点吗?


IE 内部用于处理由 DOM 分配的内存或为 DOM 分配的内存的垃圾收集器不知道如何释放由 JScript 引擎分配的可能悬空的内存。因此,它只是忽略这些事情。

因此,您将事件处理程序绑定到 DOM 元素(或类似的东西),并且您的事件处理程序是在某个其他函数的调用中创建的函数,并且该其他函数有一个本地数组,其中包含十亿个内容,好吧,在 DOM 元素本身被垃圾化很久之后,甚至在page包含它的那个已经被释放了(我想;已经有一段时间了)。

function bindHandler(domElement) {
  var hoHumWhatever = generateGiganticObjectNow();

  domElement.onclick = function() {
    alert("oww you clicked me");
  };
}

现在“hoHumWhatever”变量被保留在闭包中。当重新加载页面或修改 DOM 导致元素被丢弃时,DOM 垃圾收集器将无法对指向 JScript 拥有的内存的属性执行任何操作。另一方面,JScript 不知道 DOM 节点已被释放,因此它认为闭包内存仍然被引用。

我承认这在某些细节上可能不准确,但这是基本问题。很多人都写过关于此事的文章,包括 Crockford 先生和(我认为)quirksmode 的 ppk。

edit更仔细地重读后你发布的代码,我认为might be类似但相反情况的示例:小函数返回对 DOM 值的一部分的引用,因此也许有人说 JScript 将挂在 DOM 内存上(而不是反之亦然)。现在,在这种特殊情况下,我有点怀疑,因为除了对 DOM 属性的简单引用之外,我看不出有什么东西是如何从该闭包中“逃脱”的,该属性应该是一个原始字符串实例,因此实际上应该是这样的不会造成问题。然而这些事情可能具有欺骗性,所以我就坐在这里挠头。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IE 因在闭包中引用 DOM 元素而导致内存泄漏? 的相关文章

随机推荐

  • 如何在 Express 4.0 中发送 Flash 消息?

    因此 我的 Web 应用程序需要身份验证 并且我有一个注册页面 如果用户尝试使用数据库中已有的电子邮件进行注册 我想向他们显示一条错误消息 我正在尝试在 html 端使用此代码来执行此操作 div class alert alert dan
  • 如何将 BufferedImage 转换/转换为图像?

    我想转换一个BufferedImage to an java awt Image 我的源图像是 tif 所以我使用 JAI 将其读取为PlanarImage PlanarImage 源 JAI create 文件加载 IMG DIR tag
  • 单选按钮列表 OnSelectedIndexChanged

    我正在寻找处理 ASP net RadioButtonList 后面的 C 代码 上选择的索引更改的最佳方法 我有 3 个列表项 对于第一个 我希望它在页面上显示隐藏的 asp textbox 而其他 2 个将隐藏文本框 asp net s
  • 开发类似 python 的小型语言时的缩进控制

    我正在使用 flex byacc 用于词法和解析 和 C 开发一种类似 python 的小型语言 但我有一些关于范围控制的问题 就像 python 一样 它使用空格 或制表符 进行缩进 不仅如此 我还想实现索引中断 例如 如果您在另一个 w
  • C#中使用私有变量有什么好处

    示例代码 替代代码如下 person cs using System class Person private string myName N A Declare a Name property of type string public
  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • Excel 中的样条插值

    我会让这个问题变得简单明了 因为我的截止日期已经到了 在为我的部分做一些报告时 我到达了可以真正在 Excel 中使用插值的部分 现在 我从未对其函数或一般的 VBA 进行过任何练习 那么 有没有一个地方我可以 或者你们中的任何人都知道一些
  • 从另一列计算出的列?

    给出下表 id value 1 6 2 70 有没有办法添加根据同一个表中的另一列自动计算的列 与 VIEW 类似 但属于同一个表的一部分 举个例子 calculated将是一半value Calculated应该会自动更新value变化
  • ASP.NET Web 服务中的 XML 文档中存在非法字符

    我要问并回答我自己的问题 我希望没人介意 但我认为这可能对其他人有用 如果您设置的 ASP NET Web 服务返回的对象包含对 XML 无效的字符 则在将对象序列化为 SOAP xml 并且客户端尝试反序列化该 xml 后 将会引发异常
  • 如何将图像存储在网站根目录之外

    我希望用户上传的所有图像都保存在我的网站目录之外 让我为大家解释一下 假设我有一个网站部署在服务器中 目录路径是 e g D TestWeb 目前我添加了一些其他目录来存储图像 D TestWeb imgProfile D TestWeb
  • 32位机器如何计算双精度数

    如果我只有32位机器 CPU如何计算双精度数 这个数字是 64 位宽 FPU 如何处理它 更普遍的问题是 如何计算比我的 alu 更宽的东西 不过我完全理解整数方式 您可以简单地split https stackoverflow com q
  • LINQ Group By 投影成非匿名类型?

    我有以下 LINQ 示例 var colorDistribution from product in ctx Products group product by product Color into productColors select
  • 阻止 ItemsControls 共享过滤器

    我有两个 ItemsControl 一个是 ListView 另一个是我正在开发的自定义控件 我已将两个控件的 ItemsControl ItemsSource 属性设置为同一个 IEnumerable 对象 在本例中为 List 我将筛选
  • 使用 ImageProcessor 从 MemoryStream 保存/加载图像时出现一般 GDI+ 错误

    我在 imageFactory Load inStream 线上遇到通用 GDI 错误 我的项目是 ASP NET Core Razor Pages 我尝试将 inStream 克隆到新流 这在之前保存位图时对我有帮助 但没有成功 以前有人
  • 如何安装wkhtmltopdf?

    现在我正在使用rails 3 0 0 我正在使用Ubuntu 11 10 64位操作系统 我想安装wkhtmltopdf 请告诉我wkhtmltopdf的静态版本 安装中wkhtmltopdf 在 Ubuntu Linux 机器上 首先使用
  • GWT 和 Guava 的问题

    我很难让 GWT 与 Guava 一起工作 我添加了guava r09 gwt jar到我的类路径 并且
  • 迁移后删除轨道模型

    我觉得很奇怪 创建模型 运行迁移 销毁它 然后再次创建相同的模型会报告 SQL 异常 project master rails g model name name invoke active record create db migrate
  • 为 customere xml 按钮着色时遇到问题

    我在为自定义按钮着色时遇到问题 由于某种原因 似乎无论我想应用什么颜色更改 文本或背景 按钮都保持不变 我注意到button xml具有所需的颜色和正确的形状 尽管没有出现按钮background color活动的财产 活动中的按钮
  • 如何使用 React Router 6 在 React 组件之外导航

    现在我有一个历史记录模块 它让我甚至可以在反应组件之外使用历史记录 import createBrowserHistory from history export default createBrowserHistory 然后我直接在App
  • IE 因在闭包中引用 DOM 元素而导致内存泄漏?

    在最近的一次采访中 有人问我 像这段代码一样 在引用 DOM 元素时使用闭包有什么危险 var firstNameValue function elementId var firstName document getElementById