在IE中删除窗口属性

时间:2009-07-02 09:32:04

标签: javascript internet-explorer properties window

我找不到关于这个问题的任何信息;为什么以下代码在IE中不起作用?

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

IE报告“对象不支持此操作”错误。它是否与在IE问题中迭代窗口属性有关?

4 个答案:

答案 0 :(得分:49)

加斯珀对他所完成的解决方案发表了评论,但我认为值得称之为实际答案:

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

有趣的问题,我今晚只是在抨击它。 IE上引发了异常但不是Firefox。我怀疑这种解决方法会泄漏内存,所以请谨慎使用。

有人问,为什么不分配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 

答案 1 :(得分:36)

我会这样做:

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

答案 2 :(得分:2)

这有帮助吗?

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

我在IE中试过这个,而window.x确实有一个值,证明它可以设置。将值设置为null是清除它的最佳选择。

答案 3 :(得分:1)

我在处理缓存自己的数据时实现了这个解决方案 - 数据的高低并不是因为内存泄漏可能已成为一个问题。这是昂贵的,但定期重新映射对象是我最简单的方法,以确保它不会失控。

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}   

希望这对某些人有用!