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