在IE中删除一个窗口属性

我在这个问题上找不到任何信息; 为什么下面的代码不能在IE中使用?

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

IE报告一个“对象不支持这个动作”的错误。 这与IE浏览器窗口属性的迭代有什么关系?

我会这样做:

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

加斯珀对他所完成的解决scheme发表了评论,但我认为它值得作为一个实际答案:

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

有趣的问题,我今晚只是对我的头撞。 在IE上抛出exception,但不是Firefox。 我怀疑这个解决方法泄漏内存,所以谨慎使用。

有人问,为什么不分配未定义的? 重要的是,如果你想枚举键以后(虽然如果你依靠的解决方法,键枚举仍然不会做你想要的…)。 但无论如何,要突出删除和简单分配未定义( 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中试过,window.x确实有一个值,certificate可以设置。 将值设置为空是清除它的最佳select。

在处理caching我自己的数据时,我实现了这个解决scheme – caching的频率并不高,内存泄漏可能成为问题。 这是昂贵的,但定期重新映射对象是我确定它不会失控的最简单的方法。

 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} 

希望这对一些人有用!