遗漏的计时器或回调函数如何在 JavaScript 中导致内存泄漏?


遗漏的计时器/回调函数

JavaScript 中有两个计时事件,分别是 `setTimeout()` 和 `setInterval()`。前者在等待指定毫秒数后执行函数,而后者则定期执行函数(每隔一定时间间隔重复执行)。

当任何对象绑定到计时器回调函数时,它将不会被释放,直到超时发生。在这种情况下,计时器会重置自身并永远运行,直到超时完成,从而阻止垃圾收集器回收内存。这些计时器是 JavaScript 中内存泄漏最常见的原因。

示例

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

<html>
<body>
<script>
   for (var i = 0; i < 100000; i++) {
   var tiedObject = {
   callAgain: function() {
      var text = this;
      var value = setTimeout(function() {
      text.callAgain();
      }, 100000);
   }
   }
   tiedObject.callAgain();
   tiedObject = null;
   }
</script>
</body>>
</html>

避免内存泄漏

1. 为避免泄漏,在 `setInterval()`/`setTimeout()` 内提供引用,以便在垃圾收集之前需要执行函数。

2. 直接调用移除不再需要的函数。

除了 IE 等旧浏览器外,大多数现代浏览器(如 Chrome 等)都不会遇到此类问题。更重要的是,像 jQuery 这样的库会在内部进行处理,以确保不会产生泄漏问题。


更新于:2019年7月30日

615 次查看

启动您的 职业生涯

完成课程获得认证

开始学习
广告