2015-04-06 2 views
2

Я пытаюсь понять, как я могу предотвратить утечку памяти при использовании закрытий в JavaScript. Может ли кто-нибудь сообщить мне, правильно ли я делаю?Закрытие Javascript - как предотвратить утечку памяти

У меня есть фиктивная функция:

var testFunction = function(obj1){ 

    //other code.. 

    on(control, "click", function(){ 
     obj1.label= "test"; 
    }); 

}; 

1) делает выше причину утечки памяти, потому что obj1 которую ссылаются в случае щелчка.?

2) можно исправить, выполнив следующие действия:

var testFunction = function(obj1){ 

     //other code..... 

     on(control, "click", function(){ 
      var newObj1 = obj1; 
      newObj1.label= "test"; 
      newObj1 = null; 
     }); 


    }; 

Если это плохой пример, может кто-то показать мне лучший пример закрытия с утечкой памяти и как это исправить?

Заранее благодарен!

+0

Обе функции не будут работать. (Ну, функции будут работать, но обработчики событий не сработают.) – Pointy

+0

Спасибо, я достал строку, где я установил obj1 = null. – EriqaBana

ответ

2

Я пытаюсь понять, как я могу предотвратить утечку памяти при использовании закрытий в JavaScript.

Вам вряд ли понадобится. Сборщик мусора двигателя делает это за вас. Он довольно мощный и редко нуждается в помощи.

Вышеупомянутые причины вызывают утечку памяти, поскольку в объекте click указывается ссылка obj1.?

Это предотвращает obj1 от сбора мусора, да, потому что вы все еще ссылаетесь на него. Однако это не относится к «памяти утечки», потому что это намеренно. Вы хотите, чтобы сохранить объект в памяти.

Это может стать утечкой, если testFunction называется более часто, чем вы ожидали, и если on сохраняет закрытие дольше, чем необходимо.

можно исправить, выполнив следующие действия

а) нет ничего, чтобы исправить б) нет, вводя дополнительную переменную, не изменяет поведение. obj1 по-прежнему ссылается на закрытие.

+0

Спасибо за разъяснение того, что квалифицируется как утечка памяти, потому что я хочу сохранить объект. – EriqaBana