我找不到关于这个问题的任何信息;为什么以下代码在IE中不起作用?
window.x = 45;
delete window.x;
// or delete window['x'];
IE报告“对象不支持此操作”错误。它是否与在IE问题中迭代窗口属性有关?
答案 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}
希望这对某些人有用!