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