码迷,mamicode.com
首页 > 其他好文 > 详细

IE 不能执行已释放script的代码

时间:2014-07-09 22:48:21      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

从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。有没有注意这行代码: 

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

 

在IFrame中为全局变量top.G_config创建了一个数组,而数组在JS中是一个复杂类型对象。因此,一个全局变量引用了IFrame中创建的一个数组,而这个数组会在IFrame被移除Dom的时候,同时被回收。当第二次打开弹出窗去操作这个全局变量的时候就会报错:不能执行已释放script的代码

如何避免这个问题(So easy!):

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

IE 不能执行已释放script的代码,布布扣,bubuko.com

IE 不能执行已释放script的代码

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/zhouwenhong/p/3829710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!