不能執行已釋放script的代碼

從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。有沒有注意這行代碼: url

1 top.G_config['url_list'] = [];

 

在IFrame中爲全局變量top.G_config建立了一個數組,而數組在JS中是一個複雜類型對象。所以,一個全局變量引用了IFrame中建立的一個數組,而這個數組會在IFrame被移除Dom的時候,同時被回收。當第二次打開彈出窗去操做這個全局變量的時候就會報錯:不能執行已釋放script的代碼spa

 

2. 如何避免這個問題

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

相關文章
相關標籤/搜索