技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营
卡卡网是专业的网站测速平台,网速测试,测试网站速度,就来卡卡网 ~
问题反馈网络日志

【DiyVM】沙田机房/香港云/回国CN2线路/AMD EPYC/39元一月5M/CN2海外云主机 24元/月BGP+CN2海外云 低至25元/月海外主机 低至$2/月

DiyVM:香港VPS惊爆价36元一月
★站长/主播变现★有流量就来
5M CN2 GIA云主机 24元起
一一一云主机 26元起一一一
官方高价收量,每日稳定结算

一一云主机 24元 3折起一一
海外CN2云 低至$2.5/月
海外云低至2折 298/年
免费测试★APK免杀 谷歌过保护
官方收量CPA/CPS长期稳定

海外主机 5M CN2 低至$2/月
恒创科技 一 海外服务器 ● 高速稳定
★解决安装报毒★谷歌过保护机制
超级签★免杀★加固★满意付款
全球云主机 3天试用再买

【菠萝云】香港4G内存99元,马上开通
亿人互联-津/京BGP托管租用/VPS
苹果签名/APP封装/远控免杀
10M CN2海外云VPS 53元/月
CN2 GIA/1000Mbps $111/月

实力产品变现
实力产品变现
实力产品变现
实力产品变现
实力产品变现

赞助商

分类目录

赞助商

最新文章

本文介绍我们要用jQuery操作HTML,移除某class的div标签,但保留内...
在书写正则表达式时,* + ? 符号非常常见,但是它们又比较容易混淆。本文将用一...
本文我将给大家介绍如何用JS+CSS来实现可移动显示的图片背景效果。 
在一些商品展示的网页里,我们经常看到图片放大的效果。本文就给大家介绍一下,如何用...
本文介绍如何分别使用JS和jQuery两种方法来实现点击按钮复制文字到剪贴板,只...
本文介绍如何使用jquery-resizable调整表格(table)列宽。
本文介绍如何使用jquery-resizable插件调整左右/上下窗格大小。

搜索

setTimeout()如何导致JavaScript内存泄漏?怎样避免?

作者:admin    时间:2022-6-21 20:4:47    浏览:3890

什么是JavaScript内存泄漏?它是如何产生的?我们该如何避免?在本文中,我将介绍计时器回调setTimeout()是如何导致JavaScript内存泄漏的,然后示例说明如何避免。

setTimeout()导致JavaScript内存泄漏

JavaScript中有两个计时事件,即 setTimeout()setInterval()。前者在等待指定的毫秒数后执行一个函数,而后者周期性地执行一个函数(每隔一定的时间间隔重复一次)。

当任何对象绑定到计时器回调时,它不会被释放,直到超时发生。在这种情况下,计时器会自行重置并永远运行,直到超时完成,因为不允许垃圾收集器删除内存。这些计时器是 javascript 中内存泄漏的最常见原因。

例子

在以下示例中,计时器回调及其绑定对象(tiedObject)将在超时完成之前释放。与此同时,计时器会自行重置并永远运行,因此即使没有对原始对象的引用,它的内存空间也永远不会被收集。

  1. <html>
  2. <body>
  3. <script>
  4.    for (var i = 0; i < 100000; i++) {
  5.    var tiedObject = {
  6.    callAgain: function() {
  7.       var text = this;
  8.       var value = setTimeout(function() {
  9.       text.callAgain();
  10.       }, 100000);
  11.    }
  12.    }
  13.    tiedObject.callAgain();
  14.    tiedObject = null;
  15.    }
  16. </script>
  17. </body>>
  18. </html>

避免内存泄漏

1、为避免泄漏,在 setInterval()setTimeout() 中提供引用,以便在执行垃圾回收之前需要执行函数。

2、一旦不再需要函数,就直接调用删除函数。

下面示例显示如何避免内存泄露

HTML

  1. <p>Live Example</p>
  2. <button onclick="delayedAlert();">Show an alert box after two seconds</button>
  3. <p></p>
  4. <button onclick="clearAlert();">Cancel alert before it happens</button>

JavaScript

  1. var timeoutID;
  2. delayedAlert();
  3.  
  4. function delayedAlert() {
  5.   timeoutID = window.setTimeout(slowAlert, 2000);
  6. }
  7.  
  8. function slowAlert() {
  9.   alert("That was really slow!");
  10.   clearAlert();
  11. }
  12.  
  13. function clearAlert() {
  14.   window.clearTimeout(timeoutID);
  15. }

结果展示

 

demodownload

解释

示例中,在网页设置了两个简单的按钮,以触发 setTimeout()clearTimeout() 方法:按下第一个按钮会设置一个定时器,定时器在 2s 后显示一个警告对话框,并将此次 setTimeout 的定时器 ID 保存起来,按下第二个按钮可以取消定时器。

返回值timeoutID是一个正整数,表示定时器的编号。这个值可以传递给clearTimeout()来取消该定时器。

需要注意的是 setTimeout()setInterval() 共用一个编号池,技术上,clearTimeout()clearInterval() 可以互换。但是,为了避免混淆,不要混用取消定时函数。

在同一个对象上(一个 window 或者 worker),setTimeout()或者setInterval()在后续的调用不会重用同一个定时器编号。但是不同的对象使用独立的编号池。 

x

总结

本文介绍了计时器回调setTimeout()是如何导致JavaScript内存泄漏的,然后示例说明如何避免。

什么是JavaScript内存泄漏?

内存泄漏可以定义为应用程序不再使用或需要的一块内存,但由于某种原因没有返回给操作系统。简单来说,它是永远等待使用的被遗忘的数据。

参考文章

标签: 内存泄漏  setTimeout  
x
广告: 【限时】云主机 24元/月