2012-03-28 76 views
2

假设我有以下代码如果我从未拨打回叫,JavaScript会发生什么情况?

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

在没有错误的情况下,回调被调用。在出现错误的情况下,它不是。假设调用函数如下所示

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

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

+0

控制台。日志也可以被认为是一个回调;并且'else'块内部的代码永远不会执行..所以你有一个匿名函数被定义但是没有被执行。我在代码中看不到任何问题。只是一个考虑,我不是专业人士 – gpasci 2012-03-28 00:50:28

回答

9

JavaScript对象将不会享有开垦只要,因为它是强可达:即,如果它可以通过遍历从一个根对象的对象图(其基本上相当于一个全局属性或达到,可能是封闭的,可变的)。任何对象不再可以通过JavaScript访问,并且不会再通过JavaScript访问,并且由GC回收(当GC感觉如此时)。

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

因此在这种情况下,没有“内存泄漏”。然而,想象这种情况:

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

快乐编码。


从技术上讲,一个真正聪明的JavaScript引擎可确定由callback指定的对象不再是强可到达(通过callback)在“如果”分支。我不确定是否有任何JS引擎实际上走得这么远,但在讨论关闭中绑定的函数作用域时,问题会变得更有趣(如果这将保留所有由所有变量命名的对象,即使那些以后未访问的对象-reachable)。

0

无需担心无法调用回调而导致内存泄漏。你可能想要有一个错误回调。

0

添加到上面的答案见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management。凡说:

该算法减少了“不需要 对象了。”到“的对象是不可达”的定义。

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

相关问题