Предотвратяване на JS memory leaks?

F1r3Fl3x

Registered
От скоро започнах да се притеснявам за т.нар. Memory Leaks в джаваскрипт, защото проектът, по който работя използва страшно много джаваскрипт. Изчетох доста материал из интернет и горе-долу придобих представа как се получават и как да ги предотвратявам, но ще съм благодарен и на някой друг да сподели опита си с тази напаст :)
 
Rado каза:
Внимаваш най-вече с function closures.
http://www.jibbering.com/faq/faq_notes/closures.html
Под 'изчетох доста материал в интернет' имам предвид първите 3-4 страници в гугъл :)
Тази статия е твърде дълга и лощо обяснена, снощи я прегледах.

Преди малко на мерих този пост.
До колкото разбрах проблема е, че когато в дадена функция, която използва променлива, която не е дефинирана в самата нея, не може да се обработи от garbage collector-а. И трябва да си направя кода така, че да не използвам closures, нали така? Или пак не съм разбрал нещо :D
 
Без closures JavaScript втобще нямаше да е този мощен език, който е в момента. Проблем с memory leaks може да имаш само ако съхраняваш много инфорамция, тоест правиш супер мащабно js приложение. Иначе да не ти дреме, че изтичат някви байтове. Даже jquery не могат да изчистят напълно проблема с изтичане на памет. То е проблем само под IE( мисля че IE8 фиксира това) и идва от това, че JavaScript и DOM имат отделни изчистващи системи, и когато съществуват кръгови референции( js_object1 -> dom_object1 -> js_object1 -> dom_object1 ... ) те не могат да бъдат обработени от garbage collector-а и паметта не може да бъде освободена. Това става най-вече при работата със събития и xmlhttp, а closures по-някога го правят объркващо и адски трудно за откирване. Та моя съвет е не се занимвай с това.
 
@I_V_O, мерси за обяснението !
Само да те питам, аз си структурирам кода по следният начин:

Код:
var sth = {
    method1: function(){
        //do stufff
        this.obj1.method1();
    },
    var1: 'asdasd',
    obj1: {
        method1: function(){
            alert(obj.var1);
        },
        method2:function(){
        }
    }
};

Има ли възможност от някакви изтичания, макар и малки ?
 
Ти не работиш с DOM елементи => няма начин. Може да изчистваш всички референции към DOM елементи в края на изпълнението на скрипта или функция:

function(){
var elm = document.getElementById("asas");
// ,.....
//......

//освобождава паметта
elm = null;
}

Ама това е някакво издребняване ... ;)
 

Back
Горе