遗漏的计时器或回调函数如何在 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 这样的库会在内部进行处理,以确保不会产生泄漏问题。
广告