不能执行已释放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

相关文章
相关标签/搜索