Лучший подход к обнулению переменных, объектов в Javascript

Я создаю что-то для мобильных устройств и хотел бы как-то очистить нулевые объекты, переменные, чтобы освободить немного памяти. Здесь у меня есть два быстрых примера, обе являются анонимными функциями, как я считаю, но какой способ лучше или более правильный подход? Извините, если я все неправильно понял. Мне кажется, что оба делают одно и то же, хотя мне больше нравится первый, поскольку объекты не будут создаваться, пока они мне не понадобятся. Вторая версия сразу же выполняла код для создания переменных, объектов и т. д., но не выполняла основную функцию сборки, пока она мне не понадобится.

Я просто пытаюсь выяснить, какой способ более распространен. Я знаю, что такие новички, как я, в основном неправильно понимают использование анонимных функций.

Версия 1

var app = function() {

        //create variables, objects
        var a = 'Data 1';
        var b = 'Data 2';

        //do some things    
        console.log(a + ', ' + b);

        //do a cleanup
        app.cleanup = function() {

            a = null;
            b = null;
            console.log(a, b);

        }
    }
    setTimeout(app, 200);

Версия 2

var app = {};

    (function(){

        //create variables, objects
        var a = 'Data 1';
        var b = 'Data 2';

        app.build = function(){                 

            //do some things
            console.log(a + ', ' + b);          

        }

        //do a cleanup
        app.cleanup = function(){

            a = null;
            b = null;
            console.log(a, b);

        }   

        setTimeout(app.build,200);

    })();

Позже в html или событии

<input type="button" onclick="app.cleanup()" value="clean" />

person devjs11    schedule 29.11.2011    source источник
comment
Вы не должны беспокоиться об освобождении ресурсов. В JavaScript есть сборщик мусора, который собирает переменные, выпадающие из области видимости, и уничтожает их. Удалите ссылку на объект, когда он вам не нужен (delete obj.yourReference, /reference = null / reference = undefined), и пусть сборщик мусора сделает все остальное.   -  person Matt    schedule 29.11.2011
comment
но чтобы удалить ссылку или ноль, вы бы выбрали мою V1 или V2? Я имею в виду, что мне все еще нужно сделать это где-то.   -  person devjs11    schedule 29.11.2011
comment
Или упрощая то, что сказал @Matt: если переменная становится недоступной (ни один другой метод не может получить к ней доступ каким-либо образом), она помечается для сборки мусора. По сути, если переменная была создана в функции (локальная переменная, как в вашем случае), после завершения функции никто не сможет получить к ней доступ, поэтому она будет автоматически очищена.   -  person bezmax    schedule 29.11.2011
comment
Вы должны знать, что эффективно вы ничего не чистите. Строки в JavaScript неизменяемы. Литералы Data 1 и Data 2 уже являются частью вашей программы, поэтому a и b просто указывают на эти уже существующие строки. Установка для них значения null просто удаляет одну ссылку на эти строки.   -  person Erich Kitzmueller    schedule 29.11.2011
comment
@Alex: В нынешнем виде № 1 не нуждается в очистке. Удалите ваше определение app.cleanup(), и a и b будут автоматически утилизированы сборщиком мусора, так как ничто не содержит ссылки на них после завершения выполнения функции.   -  person Matt    schedule 29.11.2011
comment
@Matt А что будет с приложением глобальных переменных? Если функция внутри достаточно велика, это как-то повлияет?   -  person devjs11    schedule 29.11.2011
comment
@Alex: № 2 не имеет смысла. Поскольку вы определяете их в замыкании, они всегда доступны, пока вы не удалите ссылки на app. cleanup удалит строки, но определения переменных и объявление функции останутся без дела. Кроме того, что произойдет, если кому-то снова понадобятся переменные? Они ушли! Как только вы закончите использовать ресурс, удалите ссылку на него, и сборщик мусора обработает его.   -  person Matt    schedule 29.11.2011
comment
@Alex: В № 1, поскольку app находится в глобальной области видимости, window содержит ссылку на него. Если вы сделаете delete window.app или app = null (при условии, что ничто другое не содержит ссылку на него; например, var x = window.app), функция будет удалена.   -  person Matt    schedule 29.11.2011
comment
@ Мэтт Спасибо!!! Если вы хотите обобщить сказанное, я с удовольствием приму ваш ответ.   -  person devjs11    schedule 29.11.2011
comment
@Matt Просто быстрый вопрос. Как насчет обычных функций, таких как function someName(){} Вызов этих функций someName(); его переменные не входят в глобальную область, поэтому мне не о чем беспокоиться?   -  person devjs11    schedule 29.11.2011
comment
@Alex: я не совсем понимаю, что ты имеешь в виду? Если вы говорите о переменных, внутренних для someName, то до тех пор, пока вы не присваиваете переменные чему-либо, что сохраняется после прекращения выполнения функции, или возвращаете ссылку на одну из переменных, все они будут восстановлены. Если вы видите jsfiddle.net/vQtZN, вы можете видеть, что ни obj2, ни obj1 не восстанавливаются, поскольку ссылка для них все еще существует (поскольку из функции возвращается obj2). Однако obj3 не упоминается и поэтому будет истребован.   -  person Matt    schedule 29.11.2011


Ответы (1)


Вы не должны беспокоиться об освобождении ресурсов. В JavaScript есть сборщик мусора, который собирает переменные, выпадающие из области видимости, и уничтожает их. Удалите ссылку на объект, когда он вам не нужен, используя delete obj.yourReference, reference = null или что-то подобное, и пусть сборщик мусора сделает все остальное.

Вы обнаружите, что # 1 автоматически восстанавливает сами переменные a и b, если вы удалите свое определение app.cleanup(). Если вы этого не сделаете, a и b будут заключены в замыкание, созданное функцией cleanup, которую вы оставляете позади, поэтому вы мешаете сборщику мусора выполнять свою работу.

Чтобы избавиться от всего app в #1, вам нужно будет сделать delete window.app или app = null, так как окно содержит ссылку на него.

person Matt    schedule 29.11.2011