学习过c++或者JAVA的朋友都知道,程序的内存空间存在着全局作用域,局部作用域,堆栈区,临时作用域等。如果我们在内存中申请一个操作空间,但是在执行完毕时却不主动把它delete,很可能就会造成内存的浪费,严重影响程序优化,如果是较大的程序,甚至会造成致命的后果。js虽然是一个弱类型的语言,但是仍然存在高级语言的通病,我们把他叫做js的内存泄漏。
什么叫做内存的泄露,我们用点官方些的语言来说就是:
任何对象在我们不再拥有或者需要他的时候仍然存在,称这种现象为内存的泄露。
内存泄漏有两个特点:
1.这些对象是可达的,即如果我们把整个程序当做一个无向图,存在通路与这个对象连接(说白就是,我们想要调用这个对象,还是可以调用的)
2.这些对象是无用的,或者说,我们根本已经不必再使用它了。
那么那些操作会引发内存泄露呢?我把常见的的例子写下来:
1.settimeout()的第一个参数如果是字符串而非函数的话,会引发内存泄漏,例如:
function hello(){
alert("hello");
}
setTimeout("hello()",1000);
但是这样写却不会引发内存泄漏:
setTimeout(function(){
alert("hello");
},1000);
这是为什么呢?嘻嘻,欢迎各位同学留言踊跃讨论。
2.闭包。大家都知道闭包会保存一个变量的最终的值,而且不主动设置为null,这个闭包机就会继续存在。这个就不举例子了,不懂的同学自己回去翻书。
3.控制台日志。大家知道,日志会监听程序运行的全部周期,这个更不必说了。
4.循环,两个对象相互引用并且都保留下来时,就会产生一个循环。