为什么这个函数会超时占用大量内存[第2部分]

时间:2015-01-27 08:29:06

标签: javascript

这是我的另一个问题的延续:Why does this function take up a lot of memory overtime

然而几个小时前我意识到我的实际代码(不是以下代码)占用了与以下代码相同的内存量,a.length大于 400万在我的实际代码中,经过12个小时的运行,然后就崩溃了。

var a = [];
(function loop(){
    a.push([{}, {}, {}, {}, {}, {}, {}, {}, {}]);
    if(a.length > 4e6) clearTimeout(call);
    call = setTimeout(loop);
})();

正如您所看到的,我在clearTimeout(call);的长度大于 400万之后致电a为什么当a.length > 1000000我运行的空白标签时上面的代码在内存中大约需要1,000,000k +。

P.S:

  • 我实际代码中的对象不是空的并且有数据。
  • 在我的另一个问题中,内存在开发人员工具上得到了充分发挥。这次它正在填满页面本身?

2 个答案:

答案 0 :(得分:1)

clearTimeout无效。 call将保留最后一次setTimeout调用的ID,即当前正在执行的loop运行。清除它不会做任何事情,您将在每种情况下安排新的loop运行。你需要做

var call = setTimeout(loop);
if (a.length >= 4e6) clearTimeout(call);

但最好采用标准

var a = [];
(function loop(){
    a.push([{}, {}, {}, {}, {}, {}, {}, {}, {}]);
    if (a.length < 4e6)
        setTimeout(loop);
})();

答案 1 :(得分:0)

if(a.length > 4e6) clearTimeout(call);
call = setTimeout(loop);

这绝对没有。

if(a.length <= 4e6) call = setTimeout(loop);

这将是终止循环的行。