面试题-知识深度

本文探讨了JavaScript的内存泄漏检测方法,包括使用Chrome DevTools的Performance和Memory工具。介绍了常见的内存泄漏场景,如全局变量、事件和定时器引用。此外,文章还比较了for循环与forEach遍历的速度,讨论了Vue的生命周期及其对DOM操作的影响,以及Vue2和Vue3的Diff算法差异。同时,还涵盖了浏览器和Node.js的事件循环区别、多进程与线程的概念以及它们在JavaScript中的应用。
摘要由CSDN通过智能技术生成

如何检测js内存泄漏?js内存泄漏场景有哪些

内存泄漏
可使用 Chrome devTools 的 Performance和Memory 工具来检测js 内存

  • heap锯齿状是是没有内存泄漏
  • heap曲线上升是存在内存泄漏

内存泄漏场景(以vue为例)

  • 被全局变量、函数引用,组件销毁时未清除
  • 被全局事件、定时器引用,组件销毁时未清除
  • 被自定义事件引用,组件销毁时未清除
解决方法
// 事件监听器及时销毁
mounted() {
   
  window.addEventListener('scroll', this.handleScroll) 
} 
beforeDestroy() {
   
  window.removeEventListener('scroll', this.handleScroll)
}
// 定时器及时销毁clearTimeout,clearInterval
mounted() {
   
  this.timer = setInterval(this.handleTimer, 1000)
}
beforeDestroy() {
   
  clearInterval(this.timer)
}
// EventBus 的事件解绑
mounted () {
   
 this.$EventBus.$on('handleScroll', res => this.func(res))
},
destroyed () {
   
 this.$EventBus.$off('handleScroll')
}
// 弱引用
const wMap = new weakMap()
function fn() {
   
  const obj = {
    x: 100 } // 会销毁
  wMap.set('a', obj ) // weakMap的key只能是引用类型
}
fn()
GC垃圾回收

普通函数执行完后,定义的变量会被回收,
但在闭包中的数据是不会被回收,还有被外面window引用的不会。
闭包不算内存泄漏,非预期的情况才算,闭包里的数据没被销毁是在预期内的情况

test() {
   
    function fn1() {
   
      const a = 'aa'
      console.log(a)

      const obj = {
    x:</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值