javascript匿名函数垃圾回收

Jos*_*ose 16 javascript memory-leaks

如果我有这样的功能

function do(callback) {
  //do stuff
  callback();
}
Run Code Online (Sandbox Code Playgroud)

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

do(function() { //do something else });
Run Code Online (Sandbox Code Playgroud)

在页面的生命周期内,是否收集过匿名函数?如果没有,我如何让它可用于GC?

我必须这样做吗?

var h = function() { //do something };
do(h);
delete h;
Run Code Online (Sandbox Code Playgroud)

我甚至不用担心这个吗?我正在构建一个具有较长生命周期的Web应用程序,使得许多ajax调用保持对象一段时间并且实际上并不需要页面刷新来导航.所以我想弄清楚我是否会陷入内存泄漏怪物.

Tgr*_*Tgr 11

对匿名函数的唯一引用是函数参数,并且在函数完成时消失,因此在此之后您的回调将可用于垃圾回收.除非其他东西获得对它的引用,这可以通过闭包轻松实现:

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

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

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

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