不能執行已釋放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。有沒有注意這行代碼: 

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非常具有隱蔽性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 解決IE11出現異常SCRIPT5011:不能執行已釋放Script的代碼 出現“不能執行已釋放的Script代碼”錯誤的原因及解決辦法 頁面動態加入