var theThing = null;
var replaceThing = function () {
var priorThing = theThing;
// сохранив функцию в переменной, мы невольно сохраняем и контекст (цепочку областей видимости)
// в котором она была объявлена
// т.е. в данном случае priorThing оказался в контексте unused
var unused = function () {
if (priorThing) {
console.log("hi");
}
};
// здесь ссылка на старый объект заменяется новым,
// старый объект ожидает съедения GC,
// unused так же отправится в пасть GC...
theThing = {
longStr: new Array(1000000).join('*'),
// ... и все бы хорошо, если бы не один нюанс который происходит здесь
// как там пишут: both functions share the same lexical environment
// т.е. здесь у функции будет тот же контекст что и у unused
// потому что контекст уже пошарен при создании unused
// т.е. ссылка на старый объект priorThing будет сохраняться
// в общем контексте someMethod каждый раз.
someMethod: function () {
console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000); // вызываем 'replaceThing' каждую секунду
в итоге мы получаем следующую картину
более подробно об этой утечке
info.meteor.com/blog/an-interesting-kind-of-javasc...
подебажить пример можно здесь
s.codepen.io/beholderrk/debug/jWGyaY