2016-02-22 3 views
0

Обратите внимание, что в следующем коде ребенок получает ссылку на родителя. Что происходит, когда исходная ссылка на родительскую установку равна нулю? Остается ли родитель, поскольку до сих пор существует активная ссылка от ребенка?Является ли этот Javascript причиной утечки памяти?

Javascript

var parent = function() { 
    var self = this; 
    self.runme = function() { 
    document.getElementById('output').innerText = 'run me'; 
    } 

    self.child = new child(self); 

    return self; 
} 
var child = function(parent) { 
    var self = this; 
    var parent = parent; 
    self.event = function() { 
    parent.runme(); 
    } 
} 
var p = new parent(); 
p.child.event(); 
p = null; 

HTML

<div id="output"> 
    old value 
</div> 

FIDDLE https://jsfiddle.net/jeljeljel/8fvy5r4f/

+0

Пробовали ли вы запускать любую запись производительности консоли, чтобы посмотреть, как выглядит ваша память? Есть ли конкретная проблема, с которой вы сталкиваетесь, что позволяет предположить, что у вас проблемы с утечкой памяти? – Korgrue

+0

* Что происходит, когда исходная ссылка на родительскую установку установлена ​​на нуль? * - GC очистит ее как можно скорее –

+0

Нет, я просто хочу знать, вызывает ли вообще описанный выше шаблон утечку. –

ответ

2
var p = new parent(); 
p.child.event(); 
p = null; 

В конце концов, как родительский, так и дочерний будут собирать мусор, потому что ни родитель, ни ребенок не будут «доступны». Здесь нет утечки памяти. Это предполагает, что вы имеете дело с современным интерпретатором JavaScript.

1

Это не должно потому, что большинство сборщиков мусора основано на идее reachability. В принципе, если объект недоступен из корня (ов) графа, его можно безопасно собирать. После инициализации вы создаете график, как это:

root -> parent <-> child 

Тогда после p = null вы получите это:

root X parent <-> child 

Поскольку ни parent, ни его иждивенцы достижимы, все они могут быть безопасно собраны.

Смежные вопросы