Как явно освободить объект JavaScript изнутри объекта? - PullRequest
3 голосов
/ 16 сентября 2011

Я использую рецепт Джона Ресига для JavaScript "классов" и наследования.Для этого вопроса я сократил код до следующего:

MyClass = Class.extend({

    // create an <h3>Hello world!</h3> in the HTML document
    init : function (divId) { 
        this._divId = divId;
        this._textDiv = document.createElement("h3");
        this._textDiv.innerHTML = "Hello world!";
        document.getElementById(divId).appendChild(this._textDiv);
    },

    // remove the <h3> and delete this object
    remove : function () {
        var container = document.getElementById(this._divId);
        container.parentNode.removeChild(container);

        // can I put some code here to release this object?
    }

});

Все работает хорошо:

var widget = new MyClass("theDivId");
...
widget.remove();

У меня на странице будут сотни таких вещей(очевидно, с некоторой разумной функциональностью), и я бы хотел простой способ освободить память для каждого объекта.Я понимаю, что могу использовать widget = null; и доверять GC освобождает объект при необходимости (?), Но могу ли я сделать что-то явное в методе remove()?Я знаю, что размещение this = null; в конце remove() не работает;)

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

нет способов уничтожить объекты вручную, единственный способ состоит в том, чтобы освободить все ссылки на ваш объект и доверить удаление GC на самом деле в вашем коде, вы должны очистить this._textDiv = null и container = null в методе remove, потому что это может бытьпроблема для GC в некоторых браузерах

1 голос
/ 16 сентября 2011

this - это ключевое слово, которому нельзя присвоить какое-либо значение.Единственный способ удалить объекты из области видимости - вручную присвоить null каждой переменной.

Однако этот метод не всегда работает: в некоторых реализациях XMLHttpRequest необходимо сбросить onreadystate и open функций до того, как объект XMLHttpRequest будет освобожден из памяти.

1 голос
/ 16 сентября 2011

Нет. У вас нет никакого способа получить прямой доступ к сборщику мусора. Как вы говорите, лучшее, что вы можете сделать, это убедиться, что на объект больше не ссылаются.

ИМО, так лучше. Сборщик мусора намного умнее, чем вы (и я), потому что годы исследований ушли на написание этой вещи, и даже когда вы пытаетесь оптимизировать, вы, вероятно, все еще не делаете лучше, чем это было бы.

Конечно, если вы взаимодействуете с движком JS, вы сможете контролировать выполнение и форсировать сборку мусора (и многое другое), хотя я очень сомневаюсь, что вы находитесь в этом положении. Если вам интересно, скачайте и скомпилируйте обезьяну-паука (или v8, или любой другой движок, который вам нравится), и в ответе я думаю, что gc() для обоих.

Это подводит меня к другому вопросу, поскольку стандарт не определяет внутреннюю часть сборки мусора, даже если вам удастся определить, что вызов gc в какой-то момент в вашем коде полезен, вполне вероятно, что он не будет одинаковые преимущества для всех платформ.

...