JavaScript匿名函数垃圾回收

如果我有这样的功能

function do(callback) {
  //do stuff
  callback();
}

然后我传递一个匿名函数:

do(function() { //do something else });

这个匿名函数是否在页面的生命周期中被收集? 如果没有,我如何使它可用于GC?

我必须这样做吗?

var h = function() { //do something };
do(h);
delete h;

我甚至不必担心这个吗? 我正在构建一个具有很长使用期限的Web应用程序,这使得大量的Ajax调用会将对象保留一段时间,并且不需要刷新页面来导航。 所以我想弄清楚我是否可能陷入内存泄漏怪物。


对匿名函数的唯一引用是函数参数,并且在函数完成时消失,因此您的回调将在此之后用于垃圾回收。 除了有其他的东西可以参考它,这可以通过闭包很容易地发生:

function doo(callback) {
    $.get(url, function() {
        // callback is visible here!
    });
    callback();
}
doo(function() { /* do something else */ });

callback函数(以及通过调用doo创建的整个范围)必须留在内存中,因为内部函数可以通过闭包来引用它; 它只能在内部函数被垃圾收集时进行垃圾回收,并且由于该函数是jqXHR对象的属性,所以在此之前必须对该对象进行垃圾回收,并且谁知道何时会发生这种情况......

更新您可以通过不在其他函数中定义函数来避免不必要的关闭:

var func = function() {
    // callback is not visible here
}
function doo(callback) {
    $.get(url, func);
    callback();
}
doo(function() { /* do something else */ });

注意循环引用,否则浏览器的GC将清除它们。 闭包使创建循环引用变得非常简单,即使您从创建它的页面离开,它也可能会被困在内存中。 因此,长时间停留在屏幕上的Web应用程序尤其容易受到攻击。

查看“内存泄漏”一节:https://developer.mozilla.org/en/A_re-introduction_to_JavaScript。

我设计了不少静态页面的Web应用程序。 我发现,即使你没有清理的对象和事件处理程序(即你肯定没有循环引用),它不能伤害。 它通常只会添加一些额外的代码行,并且会在编写代码时将内存使用和效率保持在您头脑中的最前沿。 这对于web开发人员来说是一种转变,因为在创建网站时我们通常不需要考虑这种事情。

链接地址: http://www.djcxy.com/p/27181.html

上一篇: javascript anonymous function garbage collection

下一篇: Javascript memory usage management