JS内存泄漏

内存泄漏:被分配的内存,既无法使用,又无法被回收。直到浏览器进程结束。

造成的原因:
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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值