javascript内存泄漏总结
2015-09-28 12:14
441 查看
作为一个前端,其实很少会注意到有内存泄漏的情况,大多数前端er都会认为JS是不会存在内存泄漏的,然后事物都没有绝对的,按照JS的设计初衷javascript这门语言是不应该有内存泄漏这个问题的,但是JS并不是独立的,JS本身就是用来与DOM交互的,这两者之间摩擦摩擦,就会产生一些问题,下面来说说这些问题怎么产生的以及解决办法:
1、给DOM对象添加的属性是一个对象的引用。范例:
var MyObject = {};
document.getElementById('myDiv').myProp = MyObject;
解决方法:
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null;
2、DOM对象与JS对象相互引用。范例:
function Encapsulator(element) {
this.elementReference = element;
element.myProp = this;
}
new Encapsulator(document.getElementById('myDiv'));
解决方法:
在onunload事件中写上: document.getElementById('myDiv').myProp = null;
3、给DOM对象用attachEvent绑定事件。范例:
function doClick() {}
element.attachEvent("onclick", doClick);
解决方法:
在onunload事件中写上: element.detachEvent('onclick', doClick);
4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
document.body.appendChild(parentDiv);
parentDiv.appendChild(childDiv);
解决方法:
从内到外执行appendChild:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
parentDiv.appendChild(childDiv);
document.body.appendChild(parentDiv);
5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例:
for(i = 0; i < 5000; i++) {
hostElement.text = "asdfasdfasdf";
}
这种方式相当于定义了5000个属性!
解决方法:
其实没什么解决方法:就是编程的时候尽量避免出现这种情况咯~~
上面是个人总结的几条,可能还有别的未发现的情况,欢迎补充!!!
1、给DOM对象添加的属性是一个对象的引用。范例:
var MyObject = {};
document.getElementById('myDiv').myProp = MyObject;
解决方法:
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null;
2、DOM对象与JS对象相互引用。范例:
function Encapsulator(element) {
this.elementReference = element;
element.myProp = this;
}
new Encapsulator(document.getElementById('myDiv'));
解决方法:
在onunload事件中写上: document.getElementById('myDiv').myProp = null;
3、给DOM对象用attachEvent绑定事件。范例:
function doClick() {}
element.attachEvent("onclick", doClick);
解决方法:
在onunload事件中写上: element.detachEvent('onclick', doClick);
4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
document.body.appendChild(parentDiv);
parentDiv.appendChild(childDiv);
解决方法:
从内到外执行appendChild:
var parentDiv = document.createElement("div");
var childDiv = document.createElement("div");
parentDiv.appendChild(childDiv);
document.body.appendChild(parentDiv);
5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例:
for(i = 0; i < 5000; i++) {
hostElement.text = "asdfasdfasdf";
}
这种方式相当于定义了5000个属性!
解决方法:
其实没什么解决方法:就是编程的时候尽量避免出现这种情况咯~~
上面是个人总结的几条,可能还有别的未发现的情况,欢迎补充!!!
相关文章推荐
- QJSON的编译方法
- js判断浏览器
- JSP使用自定义标签防止表单重复提交的方法
- 时间类型转json后格式化显示方法
- JavaScript之作用域与闭包详解
- jsp中自定义标签用法实例分析
- JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
- 【js】JSON.stringify 语法实例讲解
- JavaScript之作用域与闭包详解
- JavaScript实现大整数阶乘的解决方案
- js基础对象-编程模式与设计模式
- 用js实现简单的点击返回顶部效果
- 正则表达式问号的四种用法详解
- js添加行,删除行
- js实现对比百分比
- [转] 有趣的JavaScript原生数组函数
- EJB整合JSF简单的小例子
- [转] 怎样快速而优雅地遍历 JavaScript 数组
- 使用CreateJS绘制图形
- js中let和var定义变量的区别