”從Dom中刪除IFrame后,IE9+會回收內存。影響范圍:適用於 Internet Explorer 9 以及更高版本。“
1. 應用場景(相當隱蔽!!!)
在主頁面定義一個全局變量,然后讓子頁面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。有沒有注意這行代碼:
1 top.G_config['url_list'] = [];
在IFrame中為全局變量top.G_config創建了一個數組,而數組在JS中是一個復雜類型對象。因此,一個全局變量引用了IFrame中創建的一個數組,而這個數組會在IFrame被移除Dom的時候,同時被回收。當第二次打開彈出窗去操作這個全局變量的時候就會報錯:不能執行已釋放script的代碼
2. 如何避免這個問題
1 //主頁面
2 top.G_config = {‘url_list’: []}; //定義了一個全局變量
1 //IFrame頁面 2 3 //操作全局變量 4 top.G_config['url_list'].push('something'); 5 6 //操作完以后,關閉此IFrame
思路:在IFrame頁面更新全局變量,避免涉及到值引用問題。
使用JS編碼時,盡量不要使用全局變量。無法避免時,一定要慎重,要考率到IFrame中更新全局變量時,不要存在引用關系。
這個Bug非常具有隱蔽性。