为什么JS也会有内存泄漏:
首先我们来了解什么事内存泄漏:内存泄漏是指一块被分配的内存既不能使用,也不能被回收,直到浏览器进程结束。
为什么会有泄漏:
Js的回收机制
Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存,它的机制很简单,就是找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收系统会按照固定的时间间隔,周期性的执行。通常情况下有两种实现方式:标记清除和引用计数。最常用的是标记清除。
标记清除的原理就是,在变量进入环境时,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。引用计数就不详细解释了,大概就是跟踪记录每个值被引用的次数。看到这里,你大概就能想到有一些什么原因会引起内存泄漏,对,就是闭包,这个我们面试百分之80会提到的东西,当然还有几种情况,但这个是最先想到的,那么闭包是怎么引起内存泄漏的呢
1,闭包是什么,闭包就是,闭包就是能够读取其他函数内部变量的函数,说直白点,就是本应该被回收的值并没有被回收,然后在其作用域中与外部链接起来的一个区域就形成了闭包。怎么解决呢,一种是将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用。
2,意外的全局变量引起的内存泄漏
例如,在函数内部创建一个全局变量,这会导致该变量不会被回收,这个是编程错误,你要么规范自己的编程方式,或者开启严格模式。
3,没有清理的DOM元素引用
定义了一个DOM元素,但是没有清楚掉,比如,定义了一个元素绑定了bind或者on事件,如果你在移除这些DOM元素前,没有进行相应的unbind或者off操作,那么内存一定泄漏了。
4,被遗忘的定时器或者回调
在Js中setInterval的使用是相当常见的,当我们定义了一个时间函数,再不需要它的时候需要clear,如果没有被clear,定时器的回调函数以及内部依赖的变量都不能被回收,造成内存泄漏。
5,死循环
在js中如果不是特别的原因最好不要用死循环