内存泄漏:被分配的内存,既无法使用,又无法被回收。直到浏览器进程结束。
造成的原因:
1.被遗忘的定时器
定时器用完之后 手动关闭 clearInterval() clearTimeout()
2.console.log()
console.log()中接受的对象不会被垃圾回收
3.DOM泄漏
let root = document.querySelector('#root')
let ul = document.querySelector('#ul')
let li3 = document.querySelector('#li3')
// 由于ul变量存在,整个ul及其子元素都不能GC
root.removeChild(ul)
// 虽置空了ul变量,但由于li3变量引用ul的子节点,所以ul元素依然不能被GC
ul = null
// 已无变量引用,此时可以GC
li3 = null
4.意外的全局变量
JS对未声明的变量都会挂载到全局对象上。只有在页面刷新或者关闭时才会释放内存。
使用let const声明变量 或者 使用 严格模式
5.闭包
大多数情况下,闭包会造成内存泄漏。
function fn1(){
let test = new Array(1000).fill('isboyjc')
return function(){
console.log('hahaha')
}
}
let fn1Child = fn1()
fn1Child()
因为返回的函数中没有引用fn1中的变量,所以不存在内存泄漏。
function fn2(){
let test = new Array(1000).fill('isboyjc')
return function(){
console.log(test)
return test
}
}
let fn2Child = fn2()
fn2Child()
这个会造成内存泄漏。因为返回的函数引用了test而test不会被垃圾回收。
解决方法:
1.少使用闭包
2.函数调用后,外部引用置为空 fn2Child = null