编辑:更好的答案在Yury's answer中。
简而言之,我认为这里没有内存泄漏。正向斜率仅是setInterval和setTimeout的影响。由于看到了锯齿形模式,垃圾被回收了,按照定义来说,没有内存泄漏。(我想)。
我不确定是否有一种方法可以解决所谓的“内存泄漏”。在这种情况下,“内存泄漏”是指每次调用setInterval函数会增加内存使用量,如内存分析器中所示的正斜率。
实际情况是没有实际的内存泄漏:垃圾回收器仍然能够收集内存。按照定义,“内存泄漏发生在计算机程序获取内存却未能将其释放回操作系统时。”
如下图所示的内存剖面图表明,没有发生内存泄漏。每个函数调用都会增加内存使用量。OP希望由于反复调用相同的函数,应该没有内存增加。然而,事实并非如此。每次函数调用都会消耗内存。最终,垃圾被收集,创建了锯齿形模式。
我探索了几种重新排列间隔的方法,它们都导致相同的锯齿形模式(虽然有些试图因为保留了引用而导致垃圾回收永远不会发生)。
function doIt() {
console.log("hai")
}
function a() {
doIt();
setTimeout(b, 50);
}
function b() {
doIt();
setTimeout(a, 50);
}
a();
http://fiddle.jshell.net/QNRSK/14/
function b() {
var a = setInterval(function() {
console.log("Hello");
clearInterval(a);
b();
}, 50);
}
b();
http://fiddle.jshell.net/QNRSK/17/
function init()
{
var ref = window.setInterval(function() { draw(); }, 50);
}
function draw()
{
console.log('Hello');
}
init();
http://fiddle.jshell.net/QNRSK/20/
function init()
{
window.ref = window.setInterval(function() { draw(); }, 50);
}
function draw()
{
console.log('Hello');
clearInterval(window.ref);
init();
}
init();
http://fiddle.jshell.net/QNRSK/21/
setTimeout
和 setInterval
显然不是 JavaScript 的正式部分(因此它们不是 v8 的一部分)。实现留给实施者。建议查看Node.js 中 setInterval 等的实现。
setInterval(draw, 50);
,是否会出现问题?也许与紧密的间隔和匿名函数的作用域建立/拆除有关?虽然我认为Chrome会缓存该函数。 - Erik Reppen