2012-03-28 78 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中,根是全局對象)。定期地, 垃圾收集器將從這些根開始,找到從這些根引用 的所有對象,然後從 引用這些的所有對象等。從根開始,垃圾收集器將因此 找到所有可到達的對象,並且收集所有不可達的物體。

相關問題