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


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

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

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

4 61

4 ответа:

Я бы сделал это так:

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

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

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 

это поможет?

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

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

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

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}   

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