」從Dom中刪除IFrame後,IE9+會回收內存。影響範圍:適用於 Internet Explorer 9 以及更高版本。「數組
在主頁面定義一個全局變量,而後讓子頁面IFrame內的操做去更新這個值。編碼
1 //主頁面 2 top.G_config = {}; //定義了一個全局變量
1 //IFrame頁面 2 3 //操做全局變量 4 if('undefined' == typeof(top.G_config['url_list'])){ 5 top.G_config['url_list'] = []; 6 } 7 top.G_config['url_list'].push('something'); 8 //操做完之後,關閉此IFrame
看起來基本上沒什麼問題,可是這個IFrame頁面時包含在一個彈出窗裏面,操做完以後,就會從Dom中移除這個IFrame。有沒有注意這行代碼: url
1 top.G_config['url_list'] = [];
在IFrame中爲全局變量top.G_config建立了一個數組,而數組在JS中是一個複雜類型對象。所以,一個全局變量引用了IFrame中建立的一個數組,而這個數組會在IFrame被移除Dom的時候,同時被回收。當第二次打開彈出窗去操做這個全局變量的時候就會報錯:不能執行已釋放script的代碼spa
1 //主頁面
2 top.G_config = {‘url_list’: []}; //定義了一個全局變量
1 //IFrame頁面 2 3 //操做全局變量 4 top.G_config['url_list'].push('something'); 5 6 //操做完之後,關閉此IFrame
思路:在IFrame頁面更新全局變量,避免涉及到值引用問題。code
使用JS編碼時,儘可能不要使用全局變量。沒法避免時,必定要慎重,要考率到IFrame中更新全局變量時,不要存在引用關係。對象
這個Bug很是具備隱蔽性。blog