编辑:尤里的答案更好。
tl; IMO 博士没有内存泄漏。正斜率只是 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 等的实现