`
mutongwu
  • 浏览: 454107 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

IE6/7的事件注册,闭包导致内存泄露问题

 
阅读更多
IE6/7由于使用引用计数,容易产生内存泄露问题。

事件注册,由于容易使用闭包,导致问题产生:

//循环引用:element的事件函数(闭包)可以指向element。
var addListener = function (element, eventName, handler) {
  element.attachEvent('on' + eventName, function () {
      handler.call(element, window.event);
  });
};


一种处理的方式,就是先把事件函数存起来,在页面离开的时候,进行事件的移除,解除循环引用。
var register = [];
function createObj(el,fn,name){
	return {
		el: el,
		fn: function(e){
			fn.call(el,e||window.event);
		},
		eventName: name
	};
}
var addListener = function (element, eventName, handler) {
    var obj = createObj(element,handler,eventName);
    element.attachEvent('on' + eventName,obj.fn);
    register.push(obj);
};
function cleanupListeners(){
	for(var i=0; i < register.length;i++){
		var item = register[i];
		item.el.detachEvent('on' + item.eventName,item.fn);
		register[i] = null;
	}
}
window.attachEvent('onunload', cleanupListeners);


如果嫌这种方式可能带来一些麻烦,譬如onunload事件的影响,我们考虑,重新设计事件注册函数,一开始,就避开闭包的产生:(这里的代码,只是作为思路演示之用。)

ar register = [],
	fns = {},
	els = {};
var getUid = (function (){
	var id = 0;
	return function(){
		return "_uid_" + id++;
	}
})();
function setElUid(el){
	el.uid = getUid();
	return el;
}
function getElByUid(uid){
	return els[uid];
}
function createFn(uid,fn){
	fns[uid] = function(e){
		fn.call(getElByUid(uid),e||window.event);
	};
	return fns[uid];
}
function createObj(el,fn,name){
	setElUid(el);
	return {
		el: el,
		fn: createFn(el.uid,fn),
		name: name
	};
}
var addListener = function (element, eventName, handler) {
    var obj = createObj(element,handler,eventName);
    element.attachEvent('on' + eventName,obj.fn);
    register.push(obj);
};
0
3
分享到:
评论

相关推荐

    闭包和内存泄漏1

    闭包和内存泄漏是JavaScript编程...总的来说,理解和正确使用闭包可以增强JavaScript代码的功能性,但如果不注意,闭包和事件处理器可能会无意间导致内存泄漏。了解这些原理有助于编写更高效、更健壮的JavaScript代码。

    ie内存泄漏检测软件

    然而,随着技术的发展,IE浏览器的一些问题逐渐暴露出来,其中最知名的便是“内存泄漏”问题。 内存泄漏,简单来说,是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能影响不大,但随着时间...

    Drip 检测IE内存泄漏

    2. **IE浏览器中的内存泄漏**:IE浏览器对JavaScript对象的内存管理有其特殊性,如DOM对象、闭包和全局变量等处理不当都可能导致内存泄漏。此外,IE的ActiveX控件和BHO(Browser Helper Object)也可能造成内存泄漏...

    测试JavaScript在IE中的内存泄露

    2. **内存泄漏类型**:常见的JavaScript内存泄露包括全局变量、闭包引用、DOM元素引用、事件监听器等。了解这些类型有助于识别潜在问题。 3. **工具使用**:利用如IE Developer Tools(F12工具)、Chrome DevTools...

    脚本IE内存泄露检测.rar

    标题中的“脚本IE内存泄露检测.rar”表明这是一个专门针对Internet Explorer浏览器的JavaScript内存泄漏检测工具。内存泄漏是编程中常见的问题,特别是在处理大量数据或长时间运行的网页应用时,可能导致浏览器性能...

    css样式和内存泄漏

    内存泄漏的解决方案可能包括正确使用闭包、避免全局变量、利用window周期事件进行资源清理等。 “常见兼容问题.doc”可能汇总了各种类型的CSS兼容和JavaScript内存泄漏问题,为开发者提供了一站式参考。而“div+css...

    内存泄漏检测工具

    - **DOM引用**: JavaScript对象与DOM元素相互引用可能导致内存泄漏,因为DOM元素通常不会被GC清除。 - **事件监听器**: 如果不再需要事件监听,忘记移除它们会导致相关对象无法被释放。 - **定时器和回调函数**: ...

    js内存泄露问题

    JavaScript内存泄漏是一...开发者需要时刻警惕,避免因内存泄漏导致的问题,尤其是在处理大数据或长时间运行的脚本时。通过合理编程实践和使用合适的工具,我们可以有效地管理JavaScript内存,优化我们的Web应用程序。

    IE下的内存泄露问题解决方案(英文)

    当DOM元素被移除后,如果事件监听器没有被清除,那么这个DOM元素以及相关的JavaScript对象将不会被垃圾回收,从而导致内存泄露。 ### 解决方案 #### 断开循环引用 为了解决内存泄露,首要任务是断开DOM元素与...

    ext2.2的内存泄漏补丁

    然而,如果代码中存在全局变量或者闭包引用了不再使用的对象,这些对象将不会被释放,从而导致内存泄漏。 描述中提到,补丁最初是针对IE浏览器设计的,这可能是因为IE的事件处理机制与其它浏览器有所不同,可能会更...

    IE内存泄漏检测工具 Drip-0.5

    Drip-0.5是该工具的一个特定版本,它提供了更为稳定和精确的检测功能,帮助开发者快速识别可能导致内存泄漏的代码片段。 **内存泄漏的概念** 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的...

    IE 内存检测工具

    3. **ActiveX控件**: 在IE中,ActiveX技术常用于增强网页功能,但不恰当的使用可能导致内存泄漏。 4. **内存剖析**: 这是检测内存泄漏的重要手段,通过查看程序运行期间内存的分配和释放情况,找出异常增长的部分。...

    Javascript内存泄露

    在IE6中,这种类型的循环引用会导致内存泄露。 #### 六、解决方法 为了避免内存泄露,可以采取以下措施: 1. **避免全局变量**:确保所有变量都有明确的作用域,并且在使用完毕后解除引用。 2. **清理事件监听器**...

    Js内存泄漏及解决方案.pdf

    JavaScript内存泄漏指的是由于代码的某些问题导致内存不能被垃圾回收机制正常回收,从而随着时间的推移,内存消耗持续增长。这不仅会导致程序运行缓慢,最终还可能导致程序崩溃。根据给定文件中的内容,我们可以分析...

    jquery 内存泄露bug

    标题 "jquery 内存泄露bug" 指的是在使用jQuery库进行JavaScript编程时可能出现的一种常见问题,即内存无法正常释放,导致应用占用过多内存,影响性能甚至可能导致浏览器崩溃。这个问题通常与对象引用、事件监听器和...

    extjs 2.2 内存泄漏补丁

    综上所述,"extjs 2.2 内存泄漏补丁"是一个针对性的修复方案,旨在解决在IE6上使用ExtJS 2.2时遇到的内存管理问题。通过替换原有的JavaScript文件,开发者可以期望改善应用程序的内存效率,从而提高用户体验。然而,...

    JavaScript_内存泄露

    这就会导致内存泄露。 对于闭包,它们是JavaScript中一个强大的特性,允许函数访问并操作外部作用域的变量。然而,闭包也会带来潜在的内存问题,因为它们可以保持对外部作用域的引用,即使外部作用域已经不再需要。...

    深入浅出JavaScript内存泄漏.doc

    Closures是JavaScript的一个强大特性,但也可能导致内存泄漏。当函数内部引用了外部作用域的变量,即使函数执行完毕,这些引用仍然存在,阻止了垃圾回收器回收相关内存。比如,事件处理器中使用闭包,如果不正确地...

    JQuery1.4+ Ajax IE8 内存泄漏问题

    JQuery1.4版本的改动导致了在IE8中出现了问题,而作者提到的IE6和IE7未测试,但有一个有趣的现象是,IE6并不受影响,具体原因不明。这可能与IE6自身的内存管理方式或其他内部实现的差异有关,或者是IE8在处理DOM元素...

Global site tag (gtag.js) - Google Analytics