我找不到关于这个问题的任何信息;为什么以下代码在IE中无法工作?
window.x = 45;
delete window.x;
// or delete window['x'];
IE报告了一个"对象不支持此操作"的错误。这与在IE中迭代窗口属性有关吗?
我找不到关于这个问题的任何信息;为什么以下代码在IE中无法工作?
window.x = 45;
delete window.x;
// or delete window['x'];
IE报告了一个"对象不支持此操作"的错误。这与在IE中迭代窗口属性有关吗?
Gasper在他完成的解决方案中发表了评论,但我认为这值得单独作为一个实际答案提出:
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] = undefined;
try{
delete window[x];
}catch(e){}
这有帮助吗?
window.x = 45;
alert(window.x);
window.x = null;
我在IE浏览器中尝试过这个方法,window.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}
希望对某些人有用!
Object.keys()
在<= IE8中无法工作(这些是首先导致delete
出问题的原因)。此外,您可能意味着在catch块内部使用obj[key] = undefined
。;] - WynandB
window.x
在任何情况下都不应该是这种情况),1999年(第三版)规范中也没有允许从delete
抛出异常,并且新的第五版规范仅允许在新的严格模式下从delete
抛出异常。在这方面,window
没有任何特殊之处。然而,在2010年,IE8中的JScript引擎仍然表现出这个bug。叹气 - T.J. Crowder