你说得对,似乎有一些内存没有被清理。我猜测问题可能是在像这样的for
循环中创建函数会创建一个新的作用域,该作用域必须访问i
。因此,这些函数永远不会被清理。我说错了 - 这些函数肯定会被清理。在我的浏览器中测试,内存使用量超过了900MB。
需要注意的是,这样做没有任何好处,最多只能算是“糟糕的代码”。你应该创建一个函数并重复使用它:
function test () {
var fn = function () {};
for (var i = 0; i < 1000000; i++) {
setTimeout(fn, 1000);
}
}
我的观察是,内存使用量迅速上升到900MB以上,然后在几分钟内逐渐回落到接近正常水平。
如果您需要在函数内部访问变量i
,我很抱歉告诉您,您的代码将无法实现。您只能看到i
的最后一个值(1000000)。如果您想在函数内部使用i
,可以使用工厂函数。在我的测试中,内存最终被清理:
function test () {
function factory (n) {
return function () {
}
}
for (var i = 0; i < 1000000; i++) {
setTimeout(factory(i), 1000);
}
};
不幸的是,如果您使用bind
,内存问题仍然存在:
function test () {
var fn = function (n) { };
for (var i = 0; i < 1000000; i++) {
setTimeout(fn.bind(null, i), 1000);
}
}
关于页面刷新后内存使用仍然很高,我无法解释,但可能与浏览器为正在使用大量内存的选项卡保留更多内存有关。我不知道,只是猜测而已。