忘记定时器或回调如何导致 JavaScript 内存泄漏?

javascriptobject oriented programmingprogramming

忘记定时器/回调

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 这样的库在内部进行处理,以确保不会产生泄漏问题。 


相关文章