Как удалить объект в Javascript Crossbrowser

var obj = {
    destroy: function(){this = null;}
};

obj.destroy();

Это работает в Chrome, однако Firefox по какой-то причине выдает ошибку, ссылающуюся на это. Есть ли лучший способ убить этот объект в методе?

Ошибка:

invalid assignment left-hand side
[Break On This Error] destroy: function(){this = null;} 

3 ответа

Решение

Не уверен, почему в Chrome это возможно, но вы не можете присвоить этому значение. Вы можете ссылаться на это, но вы не можете присвоить ему значение.

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

Я полагаю, вы могли бы попробовать что-то вроде этого:

var foo = {
    // will nullify all properties/methods of foo on dispose
    dispose: function () { for (var key in this) this[key] = null; }
}

foo.dispose();

Почти как можно ближе к юридическому аннулированию "этого"...

Удачного кодирования.

В

Назовите меня по-старому, но:

foo = null;

Я не уверен, почему вы делаете это сложно. Javascript - это язык для сборки мусора. Все, что вам нужно сделать, чтобы что-то освободить, - это убедиться, что на него больше нет ссылок.

Итак, если вы начнете с:

var obj = {
    data: "foo";
};

и теперь вы хотите избавиться или "освободить" этот объект, все, что вам нужно сделать, это очистить ссылку на него:

obj = null;

Поскольку в вашем коде больше нет ссылок на ту структуру данных, которую вы изначально определили и присвоили objсборщик мусора освободит его.

Объект не может уничтожить себя (потому что другие вещи могут иметь ссылки на него). Вы разрешаете его освобождение, удаляя все ссылки на него. Объект может очистить свои собственные ссылки на другие вещи, хотя это обычно не требуется, так как удаление всех ссылок на сам объект также позаботится о ссылках, которые он содержит (за исключением некоторых ошибок с циклическими ссылками между JS и DOM в некоторых старых браузерах - в частности IE).

Один раз, когда вы можете явно "удалить" что-то, это если у вас есть свойство объекта, который вы хотите удалить. Итак, если у вас есть:

var obj = {
    data: "foo",
    count: 4
};

И вы хотите удалить свойство "data", вы можете сделать это с помощью этого:

delete obj.data;

если свойство / ключ были назначены программно через переменную, подобную этой:

var key = "xxx";
obj[key] = "foo";

Вы можете удалить этот ключ с помощью:

delete obj[key];
Другие вопросы по тегам