标题党了,其实是内存泄露。(是泄露!!)以下纯是个人见解,读者自辩
首先什么是内存侧漏呢?
我的理解是内存不能被有效的利用,或者内存在被使用后不能有效的回收再利用,最后造成可利用的内存减少,影响执行效率。
之前写JavaScript的时候并不会特意去关注内存泄露的问题,因为那都是些小case,代码也只有几百行。就算造成内存泄露,也被忽略了。(习惯就是这样慢慢养成的,推荐大家不要如此这般)
javascipt内存泄露是如何产生的?
其实很容易产生,当你这么做以后:
function HelloWorld() {
var robot = document.getElementById('robot');
robot.onclick = function () {
window.alert('Hello World!');
};
}没有去做robot.onclick = null;robot = null;,其实内存就少量的侧漏了...如何保护呢,我们可以换一种形式:
function sayHelloToWorld() {
window.alert('Hello World!');
}
function HelloWorld() {
var robot = document.getElementById('robot');
robot.onclick = sayHelloToWorld;
}以上就是循环结构(cyclic structure),解释一下:给ID为robot的DOM元素(以下称DOM:robot)添加一个onclick事件函数,DOM:robot就有了相应的事件处理函数,而JavaScript函数对象中也有了DOM:robot的onclick属性,这就形成了循环结构。循环结构所占用的内存是可以被垃圾回收器(garbage collector)回收的,但是由于某个主流浏览器的回收机制有问题,会加重内存泄露。
使用第二种方法,也就是抛弃了闭包(closure)的方式,内存泄露也就跟着去了...

我上次遇到的严重问题是在函数返回时没法将变量置空,return 后变量还存在,而这个函数又被循环调用,导致在IE下的非常严重的内存侧漏。
另外还有个导致侧漏的原因:在IE下用JS反复重写一个DOM对象的属性也会造成大量侧漏。
目前前者的解决方法是在返回时用try{}finaly{}来将return的变量置空。
后者好像还不知该如何来解决。
fireyy最近也遇到这样的问题了?
对,这个问题以前太不在意了,现在反而养成坏习惯了,很糟糕
另外,如果是事件属性的话,就一定要紧记置成
null