不能执行已释放script的代码
2014-07-07 14:58
155 查看
”从Dom中删除IFrame后,IE9+会回收内存。影响范围:适用于 Internet Explorer 9 以及更高版本。“
看起来基本上没什么问题,但是这个IFrame页面时包含在一个弹出窗里面,操作完之后,就会从Dom中移除这个IFrame。有没有注意这行代码:
在IFrame中为全局变量top.G_config创建了一个数组,而数组在JS中是一个复杂类型对象。因此,一个全局变量引用了IFrame中创建的一个数组,而这个数组会在IFrame被移除Dom的时候,同时被回收。当第二次打开弹出窗去操作这个全局变量的时候就会报错:不能执行已释放script的代码
思路:在IFrame页面更新全局变量,避免涉及到值引用问题。
使用JS编码时,尽量不要使用全局变量。无法避免时,一定要慎重,要考率到IFrame中更新全局变量时,不要存在引用关系。
这个Bug非常具有隐蔽性。
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非常具有隐蔽性。
相关文章推荐
- 出现“不能执行已释放的Script代码”错误的原因及解决办法
- “不能执行已释放的Script代码”错误的原因及解决办法
- 不能执行已释放 script 的代码(个人碰到的问题)
- IE9出现异常SCRIPT5011:不能执行已释放Script的代码
- 页面js 出现 “不能执行已经释放的Script代码”错误
- IE9出现异常SCRIPT5011:不能执行已释放Script的代码
- “不能执行已释放的Script代码”错误的原因及解决办法
- IE10弹窗showModalDialog关闭之后提示SCRIPT5011:不能执行已释放的Script代码
- 关于 SCRIPT5011: 不能执行已释放 Script 的代码
- 解决IE11出现异常SCRIPT5011:不能执行已释放Script的代码
- 不能执行已释放 Script 的代码解块方案
- JavaScript出现“不能执行已释放的Script代码”错误的原因及解决办法
- 出现“不能执行已释放的Script代码”错误的原因及解决办法
- 关于"不能执行已释放 Script 的代码"的二种解决方案
- 不能执行已释放Script的代码
- 出现“不能执行已释放的Script代码”错误的原因及解决办法
- JavaScript出现“不能执行已释放的Script代码”错误的原因及解决办法
- WdatePicker 没有权限 不能执行已释放 Script 的代码
- IE10弹窗showModalDialog关闭之后提示SCRIPT5011:不能执行已释放的Script代码
- JavaScript出现“不能执行已释放的Script代码”错误的原因及解决办法