Удаление свойства окна в IE

Я не могу найти никакой информации по этой проблеме; почему в IE не работает следующий код?

window.x = 45;
delete window.x;
// or delete window['x'];

IE сообщает об ошибке "объект не поддерживает это действие". Имеет ли это какое-либо отношение к тому, что итерация над свойствами окна в IE возникает?

Ответ 1

Я бы сделал это следующим образом:

    window[x] = undefined;
    try{
        delete window[x];
    }catch(e){}

Ответ 2

Гаспер сделал комментарий с решением, которое он закончил, но я думаю, что его стоит вызывать в качестве фактического ответа:

try 
{ 
    delete window.x; 
} 
catch(e) 
{ 
    window["x"] = undefined; 
}

Интересная проблема, я просто ударился головой об этом сегодня вечером. Исключение выбрано в IE, но не в Firefox. Я бы заподозрил, что это временное решение утечки памяти, поэтому используйте экономно.

Спрошено, почему бы просто не назначить undefined? Имеет значение, если вы хотите перечислить ключи позже (хотя, если вы полагаетесь на обходной путь, перечисление ключей по-прежнему не будет делать то, что вы хотите...). Но так или иначе, чтобы выделить разницу между delete и просто назначить undefined (http://jsfiddle.net/fschwiet/T4akL/):

var deleted = {
    a: 1
};

var cleared = {
    a: 1
};

delete deleted["a"];
cleared["a"] = undefined;

for(var key in deleted) {
    console.log("deleted has key", key);
}

for(var key in cleared) {
    console.log("cleared has key", key);
}

console.log("deleted has a?", deleted.hasOwnProperty('a'));
console.log("cleared has a?", cleared.hasOwnProperty('a'));

выводит результат:

cleared has key a
deleted has a? false
cleared has a? true 

Ответ 3

Помогает ли это?

window.x = 45;
alert(window.x);
window.x = null;

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

Ответ 4

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

obj = {a: 1, b: 2, c: 3};
var max;

function unset(obj, key) {
    try {
        delete obj[key];
    } catch (e) {
        obj[key] = undefined;
    }

    max++;

    if(max > 200) {
        var keys = Object.keys(obj);
        var len = keys.length;
        var n_obj = {};
        for(var i = 0; i < len; i++) {
            if(obj.hasOwnProperty(keys[i]) && obj[keys[i]] !== undefined) {
                n_obj[keys[i]] = obj[keys[i]];
            }
        }
        return n_obj;
    }
    return obj;
}

obj; //{a: 1, b: 2, c: 3}
obj = unset(obj, "b"); //{a: 1, b: undefined, c: 3} OR {a: 1, c: 3}
//and then eventually we'll garbage collect and...
obj = unset(obj, "b"); //{a: 1, c: 3}   

Надеюсь, это полезно для некоторых!