Javascript 闭包引起IE内存泄露分析
来源:才华咖 本文已影响2.82W人
来源:才华咖 本文已影响2.82W人
Javascript 闭包引起IE内存泄露分析
复制代码 代码如下:
function fors(){
obj_a = obj_b;
obj_ = obj_a;
}
复制代码 代码如下:
function fors(){
obj_b = {};
obj_ = obj_b;
}
上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。
但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的.。
复制代码 代码如下:
function iememery(){
var js_obj = teElement("div");
js_ntextmenu = function(){ return false;}
}
从表面上看,没有任何循环引用。但上面是一个闭包,根据闭包的特性,内部函数有权访问外部函数的变量对象。所以当iememery()执行之后:
js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性oncontextmenu,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)
所以形成了一个,循环引用.即:
js_ntextmenu 间接引用到 js_obj 也就是说,这个对象的一个属性,又间接的引用了自己。
只要有循环引用,就会在IE下产生内存泄露。打开你的windows任务管理器,在IE中不停刷新含有这个代码的html页面,看看Iexploer进程的内存占用情况,一直上升,且不会自动回收(降低);
解决办法:
复制代码 代码如下:
function iememery(){
var js_obj = teElement("div");
js_ntextmenu = function(){ return false;};js_ntextmenu = null;//加上这句,断开引用 }
当IE中发生js对象与dom对象直接的循环引用,并且之后没有引用指向他们,
如果是IE 6, 内存泄漏,直到关闭IE进程为止
如果是IE 7,内存泄漏, 直到离开当前页面为止
如果是IE 8, GC回收器回收他们的内存,无论当前是不是compatibility模式。
之前的IE js引擎里的GC回收器只能处理js对象,不能处理DOM对象。
正确理解Javascript闭包
JavaScript中的style.cssText使用教程分解
关于javascript中cookie对象用法的实例分析
javascript中setInterval的用法总结
javascript操作select元素案例分析
javascript获取select值的方法和分析
Dreamweaver中JavaScript行为操作使用方法
使用JavaScript实现Java的List功能
Dreamweaver中JavaScript行为操作
javascript中String对象的slice()方法
浅谈javascript深入理解js闭包
java script remove Child的使用注意事项
javascript的闭包概念怎么理解
javascript闭包的高级使用方法
理解Javascript 的闭包简介
JavaScript语法分析
JavaScript toFixed方法介绍
Time To Stop Worrying About Invasive Species美文欣赏
Javascript 闭包引起IE内存泄露分析
有关JavaScript中的prototype.bind()方法介绍
浅谈液压泄露的危害与油压力异常的现象分析
java与javascript之间json格式数据互转详解
JAVA认证基础知识:JavaNativeInterface学习小结
JavaScript基本语法分析
JavaScript引擎是什么
javascript中的函数分析
JavaScript ES6中CLASS的使用指南
有关javascript在IE下trim函数无法使用的解决方法
分析JavaScript类型系统之Math
javascript分析运算符用法
如何理解Javascript的caller,callee,call,apply区别
IE与Firefox在JavaScript上的不同写法小结
关于异步JavaScript编程中的Promise使用方法
javascript中sort()的用法分析
浅析javascript中function 的length属性
JavaScript中创建字典对象(dictionary)的实例
油库泄露应急预案范文2篇
内科学论文引文分析的论文
如何理解Javascript的caller,callee,call,apply区别
JavaScript instanceof 的使用方法有哪些