循环垃圾创建中的Javascript函数分配

时间:2016-07-09 07:44:25

标签: javascript garbage-collection

简单的问题,但我还没有找到答案,我已经100%肯定了。请考虑以下代码:

版本1:

var a = [1,2,3];
function doStuff(obj) {
    //do nothing
}
function test() {
    a.forEach(doStuff);
}
setInterval(test, 1000/60);

第2版:

var a = [1,2,3];
function test() {
    a.forEach(function(obj) {
        //do nothing
    });
}
setInterval(test, 1000/60);

版本1分配2个函数,然后不分配任何其他东西。

每次调用test()时,版本2都会分配一个新函数吗?我的理解是版本2中forEach内部的匿名函数被创建每次调用 test()但是,一旦调用test()结束,就不再有对它的引用,并且可能是垃圾集。因此,如果版本2保持运行很长时间,垃圾收集器必须在清理创建的垃圾对象版本2时处于活动状态。我是对的吗?

1 个答案:

答案 0 :(得分:0)

我们可以通过使用保存其参数的函数来测试它,然后测试它们是否相等。



var saved = [];

function saveIt(fun) {
  saved.push(fun);
}

function test() {
  saveIt(function(obj) {
    // do nothing
  });
}

test();
test();
console.log(saved[0] === saved[1]);




当我在Chrome中运行时,它会记录false,因此这两个功能确实不同。

但是,差异可能不在函数的代码部分,而是在闭包的上下文中。一个不错的编译器应该能够告诉每个对它的调用对匿名函数使用相同的代码,并将其提取到所有闭包所引用的公共对象中。

更聪明的编译器应该注意到这个函数从不引用任何自由变量,所以它不需要使用词法上下文。所以每次使用它都应该是等效的,并且它可以一直重复使用。但显然Chrome编译器并不聪明。