2009-07-02 44 views
60

我找不到有關此問題的任何信息;爲什麼下面的代碼不能在IE中使用?在IE中刪除窗口屬性

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

IE報告「對象不支持此操作」錯誤。這與IE瀏覽器窗口屬性的迭代有什麼關係?

+25

只是要清楚,因爲它看起來並不像任何人的實際上在任何答案中都這樣說:這是Internet Explorer中的一個* bug *。 1999年(第3版)規範中沒有任何內容允許從`delete`拋出一個異常,即使該屬性是不存在的或不可刪除的(您的`window.x`不應該在任何情況下),並且新的第5版規範只允許在新的嚴格模式下從`delete`拋出的異常。在這方面沒有什麼特別的「窗口」。然而,IE8 *中的JScript引擎仍然*在2010年出現了這個錯誤。*嘆息* – 2010-03-28 12:44:55

+2

[好相關文章](http://perfectionkills.com/understanding-delete/)。 – alex 2011-11-18 05:31:04

+0

T.J. Crowder,窗口不是對象,它是根名稱空間的訪問者。它沒有這樣的屬性,所以當你運行刪除時,比如在這種情況下,它沒有義務因任何原因而實際刪除它們。在對象的名字上設置undefined是很好的,因爲gc會通過並消除未引用的對象。希望這有助於理解這裏的實際問題,以及爲什麼這不是一個錯誤,因爲它是一種對實現現代化的語言的較差實現選擇 – 2015-10-27 20:12:08

回答

31

我會做這種方式:

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

這是否有幫助?

window.x = 45; 
alert(window.x); 
window.x = null; 

我在IE中試過這個,window.x確實有一個值,這證明它可以被設置。將值設置爲空是清除它的最佳選擇。

+0

不幸的是,這不會從內存中刪除變量,它只是給它一個空值,但這是唯一的選擇,據我所知。 – 2009-07-02 11:50:03

+1

謝謝。我已經走了一步,並使用window.x = undefined。這仍然不是我想要的,但它會做。奇怪的是,我沒有在網上找到任何關於此的有用信息。 – 2009-07-02 17:28:39

48

加斯珀做出與他完成的解決方案發表評論,但我認爲它的價值呼喚作爲一個實際的答案:

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

我緩存我自己的數據處理時,實施該解決方案 - 數據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} 

希望這對一些人有用!