如果我从不调用回调,JavaScript中会发生什么?

时间:2012-03-28 00:44:33

标签: javascript

假设我有以下代码

function myFunction(param, callback) {
    ...
    if (err) {
        console.log("error");
        console.log(err);
    }
    else {
        callback(data);
    }
}

如果没有错误,则调用回调。如果出现错误,则不是。假设调用函数类似于以下

myFunction(param, function(data) {
...
});

是否存在内存泄漏问题或类似问题?有没有更好的方法来处理这种情况?

3 个答案:

答案 0 :(得分:10)

JavaScript对象不具备回收的条件,因为它是强可达的:也就是说,如果可以通过从根对象遍历对象图来达到它(基本上相当于全局属性,或者可能是封闭的变量)。任何不再强烈可访问的对象都不再可以通过JavaScript访问,并且将由GC回收(当GC感觉像这样)。

在这种情况下,传递给myFunction的函数对象(回调)在函数调用期间 可以通过callback访问参数*。因为在函数之后函数对象不是强可达的(例如,它没有保存到全局属性),所以函数对象有资格进行回收 - 以及它引用的任何函数作用域,如果它们不再是强可达的 - 一旦函数终止。

因此在这种情况下,没有“内存泄漏”。但是,想象一下这个案例:

window.myCallbacks = []
function myFunction(param, callback) {
    ...
    window.myCallbacks.push(callback)  // hmm, maybe always strongly-reachable?
}

快乐的编码。


从技术上讲,一个真正的智能JavaScript引擎可以确定{if}分支中callback命名的对象不再是强烈可达的(通过callback)。我不确定是否有任何JS引擎实际上走得这么远,但是在讨论闭包中绑定的函数作用域时问题变得更加有趣(如果这保留了所有变量命名的所有对象,即使是后来未被访问的那些变量,也是如此-reachable)。

答案 1 :(得分:0)

无需担心在调用回调时泄漏内存。您可能希望有一个错误回调。

答案 2 :(得分:0)

添加上述答案,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management。在哪里说:

  

该算法减少了&#34的定义;不需要对象   再" to"一个物体无法到达"。

     

该算法假定知道一组称为根的对象   (在JavaScript中,根是全局对象)。定期,   垃圾收集器将从这些根开始,找到所有对象   从这些根引用,然后从中引用所有对象   从根部开始,垃圾收集器就这样了   找到所有可到达的对象并收集所有不可到达的对象。