我找不到有關此問題的任何信息;爲什麼下面的代碼不能在IE中使用?在IE中刪除窗口屬性
window.x = 45;
delete window.x;
// or delete window['x'];
IE報告「對象不支持此操作」錯誤。這與IE瀏覽器窗口屬性的迭代有什麼關係?
我找不到有關此問題的任何信息;爲什麼下面的代碼不能在IE中使用?在IE中刪除窗口屬性
window.x = 45;
delete window.x;
// or delete window['x'];
IE報告「對象不支持此操作」錯誤。這與IE瀏覽器窗口屬性的迭代有什麼關係?
我會做這種方式:
window[x] = undefined;
try{
delete window[x];
}catch(e){}
這是否有幫助?
window.x = 45;
alert(window.x);
window.x = null;
我在IE中試過這個,window.x確實有一個值,這證明它可以被設置。將值設置爲空是清除它的最佳選擇。
不幸的是,這不會從內存中刪除變量,它只是給它一個空值,但這是唯一的選擇,據我所知。 – 2009-07-02 11:50:03
謝謝。我已經走了一步,並使用window.x = undefined。這仍然不是我想要的,但它會做。奇怪的是,我沒有在網上找到任何關於此的有用信息。 – 2009-07-02 17:28:39
加斯珀做出與他完成的解決方案發表評論,但我認爲它的價值呼喚作爲一個實際的答案:
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
我緩存我自己的數據處理時,實施該解決方案 - 數據WASN」高速緩存的頻率太高,導致內存泄漏可能成爲問題。這是昂貴的,但定期重新映射對象是確保它不會失控的最簡單方法。
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}
希望這對一些人有用!
只是要清楚,因爲它看起來並不像任何人的實際上在任何答案中都這樣說:這是Internet Explorer中的一個* bug *。 1999年(第3版)規範中沒有任何內容允許從`delete`拋出一個異常,即使該屬性是不存在的或不可刪除的(您的`window.x`不應該在任何情況下),並且新的第5版規範只允許在新的嚴格模式下從`delete`拋出的異常。在這方面沒有什麼特別的「窗口」。然而,IE8 *中的JScript引擎仍然*在2010年出現了這個錯誤。*嘆息* – 2010-03-28 12:44:55
[好相關文章](http://perfectionkills.com/understanding-delete/)。 – alex 2011-11-18 05:31:04
T.J. Crowder,窗口不是對象,它是根名稱空間的訪問者。它沒有這樣的屬性,所以當你運行刪除時,比如在這種情況下,它沒有義務因任何原因而實際刪除它們。在對象的名字上設置undefined是很好的,因爲gc會通過並消除未引用的對象。希望這有助於理解這裏的實際問題,以及爲什麼這不是一個錯誤,因爲它是一種對實現現代化的語言的較差實現選擇 – 2015-10-27 20:12:08