在IE中删除窗口属性

gas*_*r_k 65 javascript internet-explorer properties window

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

window.x = 45;
delete window.x;
// or delete window['x'];
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*man 49

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

try 
{ 
    delete window.x; 
} 
catch(e) 
{ 
    window["x"] = undefined; 
}
Run Code Online (Sandbox Code Playgroud)

有趣的问题,我今晚只是猛烈地反对它.IE上引发了异常但不是Firefox.我怀疑这种解决方法会泄漏内存,因此请谨慎使用.

有人问,为什么不分配undefined?如果你想稍后枚举密钥很重要(尽管如果你依赖于解决方法,关键枚举仍然不会做你想要的......).但无论如何,要强调删除和简单分配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'));
Run Code Online (Sandbox Code Playgroud)

产生输出:

cleared has key a
deleted has a? false
cleared has a? true 
Run Code Online (Sandbox Code Playgroud)

  • 当我向他们展示这个解决方案时,一位同事问了一个好人:为什么不跳过中间人并用未定义的任务替换删除调用? (4认同)

小智 36

我会这样做:

    window[x] = undefined;
    try{
        delete window[x];
    }catch(e){}
Run Code Online (Sandbox Code Playgroud)