我正在審查這個演示的幻燈片:http://slid.es/gruizdevilla/memory閉包如何造成內存泄漏?
,並在幻燈片中的一個,該代碼呈現它創建一個內存泄漏的建議:
var a = function() {
var smallStr = 'x',
largeStr = new Array(1000000).join('x');
return function (n) {
eval(''); //maintains reference to largeStr
return smallStr;
};
}();
閉包可以是另一個內存泄漏的來源。瞭解封閉中保留了哪些引用。
請記住:EVAL是邪惡
能有人在這裏解釋一下這個問題?
我不相信這是由同一演示文稿(其中所說的泄漏是「當一個程序反覆未能返回內存定義的內存泄漏它已經獲得臨時使用「),因爲它不會重複發生。但'largeStr'將會佔用大量內存,直到'a'超出範圍。 'eval()'也不是邪惡的,它幾乎總是這個工作的錯誤工具。 – nnnnnn
@nnnnnn:特別是在這裏,其中'eval'似乎是用來防止靜態代碼分析這將允許垃圾收集器收集'largeStr'即使當返回函數的引用是活的。 – Bergi
@MedicineMan:你是否「理解什麼引用保留在閉包*中?」或者不是? – Bergi