假设我有以下代码
function myFunction(param, callback) {
...
if (err) {
console.log("error");
console.log(err);
}
else {
callback(data);
}
}
如果没有错误,则调用回调。如果出现错误,则不是。假设调用函数类似于以下
myFunction(param, function(data) {
...
});
是否存在内存泄漏问题或类似问题?有没有更好的方法来处理这种情况?
答案 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中,根是全局对象)。定期, 垃圾收集器将从这些根开始,找到所有对象 从这些根引用,然后从中引用所有对象 从根部开始,垃圾收集器就这样了 找到所有可到达的对象并收集所有不可到达的对象。