XMLHttpRequest - 使用后释放?

2024-03-18

我正在编写一个完全由 AJAX 驱动的浏览器应用程序(我一生中第一次),这意味着:

  • 这将是一个留在浏览器中的页面,根据需要加载程序组件
  • 浏览器历史记录将是,好吧,没有。
  • 页面根本不会刷新

我关心的是我应该如何处理 XMLHttpRequests,因为我主要是 C++ 程序员,被教导当你写这样的语句时

x = new XMLHttpRequest();

你需要delete之后它。

这个问题完全是关于内存管理的,这个对象是否分配了new保留在内存中,即使在完成它的“循环”后,readyState == 4或者以某种方式释放,释放,什么?老实说,我不知道什么时候可以释放它,因为创建这些的脚本将位于 HEAD 中并可能整个工作日都坐在那里。我是否应该:

  • 创建一个或多个重复使用的 XMLHttpRequest 类型的对象,对应用程序进行编程,使其不需要超过此限制,
  • 或者没关系,我可以根据需要分配任意数量的新 XMLHttpRequest?

考虑到我的网页的“框架”将保留,请在您的答案中包括在什么时候删除这些对象以及为什么会删除这些对象(如果会的话)。希望我清楚地说明了这个问题,并感谢您提供有见地的答案。

EDIT:

考虑一个代码(为了简洁起见,我删除了许多检查意外返回值的行)onClick事件处理程序,创建 XMLHttpRequest 并发送它:

function submitme(){  
  var p = document.getElementById('p'); //a text field being sent to server
  if(typeof p!='undefined' && p!=null){
    if(p.value!=""){
      //here XMLHttpRequest is created, this function
      //returns exactly object of this type or false, when failed
      var xhr=createXmlHttpRequestObject();
      if(xhr!=false){
        xhr.open("POST", "blablabla.php", true);
        xhr.onreadystatechange=function(){
          if(xhr.readyState==4){
             if(xhr.status==200){
               //result will be posted in this div below
               var adiv = document.getElementById('resultdiv');
               //extract the XML retrieved from the server
               xmlResponse = xhr.responseXML;
               //obtain the document element (the root element) of the XML structure
               xmlDocumentElement = xmlResponse.documentElement;
               //get the response text
               if(typeof adiv !='undefined' && adiv != null){
                  adiv.innerHTML=xmlDocumentElement.childNodes[0].firstChild.nodeValue;
               }
             }//end xhr.status
           }//end xhr.readyState
         };//end xhr.onreadystatechange
         xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
         xhr.send(p.value);
       }//end xhr!=false
     }//end p.value!=""
   }//end typeof p!='undefined'
 }//end submitme()

当创建 XMLHttpRequest 对象实例时,如果触发此处理程序,则它会被引用一次xhr变量直到处理程序完成执行。此时有有多少参考文献到这个对象实例?如果我正确理解您答案中链接的文章,答案应该是none,浏览器只是等待这个请求转向readystate==4,完成执行onreadystatechange函数和对象是无法到达的?请确认。


我最近遇到了同样的问题,我在互联网上发现我不应该有任何担忧,因为它是垃圾收集的。好吧,你应该有所顾虑,因为如果你是第一次让它工作,那么很容易留下一些参考资料。

请参阅此页面:

http://javascript.info/tutorial/memory-leaks http://javascript.info/tutorial/memory-leaks

并向下滚动到“XmlHttpRequest...”

它基本上说的是:

IF每次都创建一个新的 xhr 对象(不要重复使用它们)AND在各自的 onreadystatechange 回调的闭包中捕获每个 xhr 对象THENxhr 对象永远不会被垃圾收集,并且内存泄漏将会增加。

为了避免这种情况,请使用this访问 xhr 对象(例如检查状态),并将 xhr 从闭包中取出。

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

XMLHttpRequest - 使用后释放? 的相关文章

随机推荐

  • 使用 Objective-C 从 PDF 中提取可编辑字段

    我已经研究在我的 iOS 应用程序中使用 PDF 一段时间了 我已经解决了一些难题 例如扫描操作员并在 UIWebView 中显示 PDF 然而 我真正需要做的是确定可编辑字段在 PDF 文档中 理想情况下 我希望能够直接与这些领域进行交互
  • Gstreamer Appsink 未从管道获取数据

    我正在设计一个管道 将来自 opencv 应用程序 从网络摄像头获取 的视频帧编码为 video x h264 格式 通过网络发送并在另一台不同类型的设备 可能是树莓派 上将其解码到适合我的项目的 RGB 流 为此 我应该使用硬件加速编码器
  • 如何使用Openlayers地图

    我对这个 openlayers 地图完全困惑了 即使有很多例子和维基 我也找不到如何重用它 我的意思是我想显示我的城市地图 可由管理员管理 管理员可以添加点和位置 并且它应该显示在前端 请帮我看看该怎么做 Like Conley写道 开放层
  • Java SWT 应用程序 - 置于前台

    我目前正在 Windows 7 上开发 SWT java 应用程序 通常应用程序将最小化 当串行端口上有事件时 应用程序应最大化自身 以下代码执行最大化部分 private void bringToFront final Shell she
  • 使用 Python 从解析的 HTML 中提取文本

    我是Python新手 我一直在尝试使用已用BeautifulSoup解析的正则表达式搜索html 我没有取得任何成功 我认为原因是我不完全理解如何正确设置正则表达式 我看过有关类似问题的旧问题 但我仍然没有弄清楚 如果有人可以提取 torr
  • 从命令行启动的 Visual Studio Code 合并了两个进程

    如果从命令行启动 Visual Studio Code 输入 code 则命令行 终端 进程和 vsc 进程将链接起来 vsc 日志条目写入终端 终端变得脆弱或无法使用 终止终端也会终止 VSC 这是在 Windows 10 VSC v 1
  • Json ajax 带参数传递

    function BindJson ajax type POST url NewPage aspx SerializeJson data contentType application json dataType json success
  • C++ NetBeans:如何将我的 .o 文件链接到我的项目?

    我已经买了一个课程 我有标题 h 和一个目标文件 o 我如何链接 o我的 NetBeans IDE 中的文件吗 Thanks 您需要添加您的 o文件作为外部库 我能够使用以下步骤完成此操作 转到项目属性 在下面Build gt Linker
  • Google Apps 脚本 Web 应用程序在外部网站上进行身份验证

    我需要实现一个用于登录网站的 Google Apps 脚本应用程序 然后如果该网站上的身份验证过程成功 用户应该在 google 脚本侧边栏中收到一条消息 例如 用户输入他的电子邮件和密码 然后按登录按钮 如果凭据正确 他应该登录网站 如果
  • 如何控制 graphviz 中的节点放置(即避免边缘交叉)

    我正在使用 graphviz 点 生成您可以在下面看到的图表 左下角的节点 红色椭圆 会引起烦恼 因为它的边缘与相邻节点的多个边缘交叉 有没有办法将节点放置限制在某个区域 您可以创建一个不可见的约束 以使红色节点出现在所有其他节点的左侧 r
  • 使用r32平台工具的ADB配对未知命令

    我刚刚下载了全新安装的 SDK 平台工具 因为我不需要 IDE 版本 r32 0 0 当使用 adb 对时 我得到以下信息 PS C userpath platform tools r32 0 0 windows platform tool
  • C 中的图像输出

    简单的问题 有没有办法使用 C 显示文件中的图像 例如 bmp 它显然不在graphics h中 而且我不能使用Allegro 因为它不支持Borland 或者我读过 我需要在学校项目中使用非常旧的编译器 我想问是否有人有使用其他库执行此操
  • 没有游标的存储过程

    如何在没有光标的情况下编写以下 sp 更重要的是它没有给我想要的输出 我没有写这个 我只是想解释一下这有什么问题 ALTER PROCEDURE dbo AccreditationExpiryCheck AS BEGIN SET NOCOU
  • Proguard retrace 没有将堆栈跟踪映射到实际源

    我一直在使用 eclipse 内置的 proguard 工具来混淆代码 效果很好 但是 当我尝试重新跟踪混淆代码的堆栈跟踪时 重新跟踪不会输出未混淆的堆栈跟踪 我仔细检查了mapping txt 以确保我使用的是正确的 这是我的堆栈跟踪 E
  • 如何进行 MANCOVA

    我正在尝试在 R 中执行 mancova 但是 我尝试过jmv https cran r project org web packages jmv jmv pdf包裹 x lt cbind total c total p dependent
  • n 层架构的单元测试

    我使用 3 层架构 控制器 业务和数据层 在我的数据层中 我通过传递连接字符串和其他必要的参数来调用 Sql Server 数据库 我必须为控制器层和业务层编写单元测试 我想编写一个存根 假存储库 从中返回硬编码值 结果 当我为业务层编写测
  • Git 交互式 rebase 无需打开编辑器

    Git 允许某些命令在不先打开编辑器的情况下创建或修改提交 例如 git commit amend no edit git commit fixup HEAD 我已经设定rebase autosquash to true 以便交互式变基的待
  • Android java.net.UnknownHostException:主机未解析(策略问题)

    我有 Android 代码 它使用后台进程定期 例如每小时 连接到网络上的内容源以检查更新的内容 当新用户下载该应用程序并首次运行它时 似乎 这只是 目前看来 在首次运行的情况下 因为我们服务器的 DNS 尚未缓存在设备上 第一个系列的连接
  • 使用钥匙串在 iOS 扩展及其包含的应用程序之间共享?

    我了解我可以通过启用应用程序组并使用 NSUserDefaults 在我的共享扩展及其包含的应用程序之间共享数据 请参阅在 iOS 8 共享扩展和主应用程序之间共享数据 https stackoverflow com questions 2
  • XMLHttpRequest - 使用后释放?

    我正在编写一个完全由 AJAX 驱动的浏览器应用程序 我一生中第一次 这意味着 这将是一个留在浏览器中的页面 根据需要加载程序组件 浏览器历史记录将是 好吧 没有 页面根本不会刷新 我关心的是我应该如何处理 XMLHttpRequests