Читаю статью на
хабре , не понимаю
3.Утечки памяти ссылки на несуществующие объекты. Не знаю, что со мной не так, но хоть убейте, но уже долго никак не могу переварить именно
текст, объясняющий этот код. Может кто объяснит по-проще, ибо уже жутко интересно, но жутко непонятно.
var theThing = null;
var replaceThing = function () {
var priorThing = theThing;
var unused = function () {
// 'unused' - единственное место, где используется 'priorThing',
// но 'unused' никогда не вызывается
if (priorThing) {
console.log("hi");
}
};
theThing = {
longStr: new Array(1000000).join('*'), // создаем 1Mб объект
someMethod: function () {
console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000); // вызываем 'replaceThing' каждую секунду
Каждый объект theThing содержит свой собственный объект longStr размером 1Мб. Каждую секунду при вызове replaceThing, функция сохраняет ссылку на предыдущий объект theThing в переменной priorThing. Это не проблема, ведь каждый раз предыдущая ссылка priorThing будет перетерта (priorThing = theThing;). Так в чём же причина утечки?
Типичный способ реализации замыкания — это создание связи между каждым объектом-функцией и объектом-словарем, представляющим собой лексическую область видимости для этой функции. Если обе функции (unused и someMethod), определенные внутри replaceThing, реально используют priorThing, то важно понимать, что они получают один и тот же объект, даже если priorThing переписывается снова и снова, так как обе функции используют одну и ту же лексическую область видимости. И как только переменная используется в любом из замыканий, то она попадает в лексическую область видимости, используемую всеми замыканиями в этой области видимости. И этот маленький нюанс приводит к мощной утечке памяти.